рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╕рдордп, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдореЛрд░реА рдЦрдкрдд рдФрд░ рдЬрд╡рд╛рдмрджреЗрд╣реА (рдЧрддрд┐) рд╣реИред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдп рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рд╡реЗ рдпрд╣ рднреА рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ .NET рдореЗрдВ GC рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдФрд░ рд╕рд╛рде рд╣реА, рдЖрдк .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрдХреНрд╖рд╛рдУрдВ, рдФрд░ CLR, GC, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ!
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
- рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрд░рдЪрдирд╛
- рд╕реАрдПрд▓рдЖрд░ 4.5 рдкреГрд╖реНрдарднреВрдорд┐ рд╕рд░реНрд╡рд░ рдЬреАрд╕реА
- рдЙрдЪрд┐рдд рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣
- .NET 4.0+ рдХреЗ рд▓рд┐рдП рдХреБрд╢рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЙрдиреНрдирдпрди
- рдЙрдЪрд┐рдд рдореИрдиреБрдЕрд▓ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди
Placing рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдарди рд╕рдВрд░рдЪрдирд╛
рдПрдХ рдмрд╛рд░ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реАрдПрд▓рдЖрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд▓рд┐рдЦрд╛ рдерд╛ ред рд▓реЗрдЦ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмреЗрдЪрдирд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред
рдЪрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЬрдм CIL рдЕрдиреБрджреЗрд╢
newobj рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C # рдореЗрдВ
рдирдпрд╛ рдСрдкрд░реЗрдЯрд░, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд-рдЖрдХрд╛рд░ рдХрд╛ рдорд╛рди (4 рдмрд╛рдЗрдЯреНрд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП x86, рдЯрд╛рдЗрдк DWORD) рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрдорд┐рдд рдвреЗрд░ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ,
рдЬрд┐рд╕реЗ рд╕реНрдЯреИрдХ
рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдордд рднреВрд▓рдирд╛ рдкреНрд░рдмрдВрдзрд┐рдд рд╣реАрдк рдХреЛ рд╕реНрдореЙрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАрдк рдФрд░ рд▓рд╛рд░реНрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАрдк рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдмрд╛рдж рдореЗрдВ рдЬреАрд╕реА рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ)ред рддреЛ, C ++ рдореЗрдВ рдЗрд╕ рдорд╛рди рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ .NET рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЗрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓рд┐рдВрдХ рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдкрд░ рд░рд╣рддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред
рд▓рд┐рдВрдХ рдмрдирд╛рдП рдмрд┐рдирд╛ рдЖрдк рдХрд┐рд╕реА рд╡реИрдХреНрдпреВрдо рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред
рддрд╛рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдФрд░
рдПрд╕рдУрдПрд╕ (рд╕реНрдЯреНрд░рд╛рдЗрдХ рдХреЗ рдкреБрддреНрд░) , GC.TotalMemory рдорд╛рдк, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЕрдЯрдХрд▓ рдирд╣реАрдВ рд╣реИред - рдмрд╕ рд╕реАрдПрд▓рдЖрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ, рдпрд╛
рд╕рд╛рдЭрд╛ рд╕реНрд░реЛрдд рдХреЙрдорди рд▓реИрдВрдЧреНрд╡реЗрдЬ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ 2.0 , рдЬреЛ рдПрдХ рддрд░рд╣ рдХрд╛ рд╢реЛрдз рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдкрдирд╛ MethodTable рд╣реИ, рдФрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╣реА MethodTable рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрд╛рд░ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ, рдЖрджрд┐) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рд╣реЛрддреА рд╣реИрдВ - рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░, рдЬреЛ
SyncTableEntry рдПрдбреНрд░реЗрд╕ (рд╕рд┐рдВрдХрдмреНрд▓реЙрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐), рдФрд░ рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рд╕реВрдЪрдХ (рдЯрд╛рдЗрдкрд╣реИрдВрдбрд▓) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
SyncTableEntry - рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рдПрдХ рд╕реАрдПрд▓рдЖрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдФрд░ рдЦреБрдж рдХреЛ рд╕рд┐рдВрдХрдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
SyncBlock рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдХреЛрдб рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
"рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП" рдХрд╣рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд┐рдВрдХрдмреНрд▓реЙрдХ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм GetHashCode () рдпрд╛ Monitor.Enter () рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рд╕рдорд╛рдкреНрдд SyncBlock рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣реИрд╢ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
рдпрд╣
GetSyncBlock рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдо рдлрд╝рд╛рдЗрд▓
% %\sscli20\clr\src\vm\syncblk.cpp)
ред рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
else if ((bits & BIT_SBLK_IS_HASHCODE) != 0) { DWORD hashCode = bits & MASK_HASHCODE; syncBlock->SetHashCode(hashCode); }
System.Object.GetHashCode рд╡рд┐рдзрд┐
SyncBlock :: GetHashCode рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ SyncBlock рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рд╕реАрдПрд▓рдЖрд░ 2.0 рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд┐рдВрдХрдмреНрд▓реЗрдХ рдорд╛рди 0 рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАрдПрд▓рдЖрд░ 4.0 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдореВрд▓реНрдп -1 рд╣реИред
рдЬрдм рдЖрдк Monitor.Exit () рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Syncblk рдлрд┐рд░ рд╕реЗ -1 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╕рд┐рдВрдХрдмреНрд▓реЙрдХ рдХреА рд╕рд░рдгреА
рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ,
рдЬреЛ рдЬреАрд╕реА рдХреЗ
рд▓рд┐рдП рджреБрд░реНрдЧрдо рд╣реИ ред
рдРрд╕рд╛ рдХреИрд╕реЗ? рддреБрдо рдкреВрдЫрддреЗ рд╣реЛред
рдЬрд╡рд╛рдм рд╕рд░рд▓ рд╣реИ - рдХрдордЬреЛрд░ рд▓рд┐рдВрдХред CLR SyncBlock рдПрд░реЗ рдореЗрдВ рдПрдХ рдХрдордЬреЛрд░ рд▓реЗрдЦрди рд▓рд┐рдВрдХ рдмрдирд╛рддрд╛ рд╣реИред рдЬрдм CLR рдСрдмреНрдЬреЗрдХреНрдЯ рдорд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ SyncBlock рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореЙрдирд┐рдЯрд░.рдИрдВрдЯрд░ () рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдФрд░ рд╕реНрд╡рдпрдВ рдЬреЗрдЖрдИрдЯреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рддреЛ SSCLI рд╕реНрд░реЛрдд рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо
JIT_MonEnter рд╣реИ ред
рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдореГрддрд┐ рдФрд░ рдЙрдирдХреЗ рдЖрдХрд╛рд░реЛрдВ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдореИрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ (рдПрдХ рдЦрд╛рд▓реА рд╡рд░реНрдЧ) рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг x86 рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 12 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ x64 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 24 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВред
рд╣рдо рдПрд╕рдУрдПрд╕ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдлрд╝рд╛рдЗрд▓
% %\sscli20\clr\src\vm\object.h
#define MIN_OBJECT_SIZE (2*sizeof(BYTE*) + sizeof(ObjHeader)) class Object { protected: MethodTable* m_pMethTab; }; class ObjHeader { private: DWORD m_SyncBlockValue;
рд╕реАрдПрд▓рдЖрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд╕ рд▓реЗрдЦ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдореБрдЭреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрд╢реБрджреНрдзрд┐ рдХреЗ рд▓рд┐рдП рдлрдЯрдХрд╛рд░ рд▓рдЧрд╛рдИ рдЧрдИ рдереАред рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдмреВрдд рдХреЗред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ ... рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдЕрдзрд┐рдХ рднрд░реЛрд╕рд╛ рд╣реИ!
.NET 4.0 рдореЗрдВ System.String рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рджрд╕реНрдп рд╣реЛрддреЗ рд╣реИрдВ:
- m_firstChar
- m_stringLength
- рдЦрд╛рд▓реА

рд╣рдо Empty рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреЗрдЯрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред
m_stringLength рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред
m_firstChar рдПрдХ рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рднрдВрдбрд╛рд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдПрдХ
рд╕реВрдЪрдХ (!!!) рд╣реИ, рдФрд░ рд╕рд░рдгреА рдореЗрдВ рдкрд╣рд▓рд╛ рд╡рд░реНрдг
рдирд╣реАрдВ рд╣реИ ред
рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕реАрдПрд▓рдЖрд░ рдХреЗрд╡рд▓ рдСрдлрд╕реЗрдЯ рдвреВрдВрдврддрд╛ рд╣реИред
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд░реНрдХ% \ sscli20 \ clr \ src \ vm \ object .h рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓% рдлрд╝реЛрд▓реНрдбрд░ рдЦреЛрд▓реЗрдВред
рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦрддреЗ рд╣реИрдВ:
рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо
StringObject рд╡рд░реНрдЧ рдФрд░ рдЙрд╕рдХреЗ GetBuffer () рд╡рд┐рдзрд┐ рдХреЛ
рдвреВрдВрдврддреЗ рд╣реИрдВ ред
WCHAR* GetBuffer() { LEAF_CONTRACT; _ASSERTE(this); return (WCHAR*)( PTR_HOST_TO_TADDR(this) + offsetof(StringObject, m_Characters) ); }
рдЦреИрд░, рдПрдХ рдмрдлрд░ (рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА) рдмрд╕ рдСрдлрд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рд▓реЗрдХрд┐рди System.String рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдлрд╝рд╛рдЗрд▓% рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдЖрд░реНрдХрд╛рдЗрд╡% \ sscli20 \ clr \ src \ bcl \ system \ string.cs рдХреЗ рд╕рд╛рде рдЦреЛрд▓реЗрдВ
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
рд╣рд╛рд▓рд╛рдБрдХрд┐, System.String рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ COMString рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдИ рддрд░реАрдХреЗ (PadLeft, рдЖрджрд┐)ред
рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рдЖрдВрддрд░рд┐рдХ C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рд╕рд╣реА рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ
% %\sscli20\clr\src\vm\ecall.cpp
рдлрд╝рд╛рдЗрд▓
% %\sscli20\clr\src\vm\ecall.cpp
рдХреЛ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛
% %\sscli20\clr\src\vm\ecall.cpp
рдЦреИрд░, рдЕрдВрдд рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ m_firstChar рдПрдХ
рдкреЙрдЗрдВрдЯрд░ рд╣реИ , рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Join the method code рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛:
fixed (char* ptr = &text.m_firstChar) { UnSafeCharBuffer unSafeCharBuffer = new UnSafeCharBuffer(ptr, num); unSafeCharBuffer.AppendString(value[startIndex]); for (int j = startIndex + 1; j <= num2; j++) { unSafeCharBuffer.AppendString(separator); unSafeCharBuffer.AppendString(value[j]); } }
рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ
рд╕рдВрд╕реНрдХрд░рдг (рд▓реЗрдХрд┐рди рдЙрд╕реА
рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде ) рдкреНрд░рд╕рд┐рджреНрдз рдЬреЙрди рд╕реНрдХреАрдЯ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддрд╛ рд╣реИред
рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕реНрдЯреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд╕реНрдЯреИрдХ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рднреА рдХреЛрдИ рд╡рд┐рдзрд┐ рдХрд╣рд▓рд╛рддреА рд╣реИред рдпрд╣ рдХреЙрд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ (рд╕реНрдерд╛рдиреАрдп рдЪрд░, рдкреИрд░рд╛рдореАрдЯрд░, рдЖрджрд┐ рдХреЗ рдкрддреЗ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЙрд▓ рдЯреНрд░реА рдПрдХ FIFO рдХрдВрдЯреЗрдирд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдвреЗрд░ рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рд╡рд░реНрддрдорд╛рди рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореВрд▓ рд╢рд╛рдЦрд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛, рдЪрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд-рдЖрдХрд╛рд░ рдХрд╛ рдорд╛рди (4 рдмрд╛рдЗрдЯреНрд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, x86 рдХреЗ рд▓рд┐рдП, DWORD рдЯрд╛рдЗрдк рдХрд░реЗрдВ) рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдвреЗрд░ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде, JIT- рддреБрд░рдВрдд рд░реИрдо рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдРрд╕рд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдореЛрд░реА рд╕реЗрд▓реНрд╕ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЕрдВрджрд░ рдЕрд▓реНрдЯреНрд░рд╛рдлрд╛рд╕реНрдЯ рд░реИрдо рдореЗрдореЛрд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджреБрд░реНрдЧрдо рднрд╛рдЧ рд╣реЛрддрд╛ рд╣реИред
CPU рдХреИрд╢ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
тЦМ рдЬреАрд╕реА рдбрд┐рд╡рд╛рдЗрд╕
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди (рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░рдиреЗ) рдХреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ - рдЙрд░реНрдл тАЛтАЛрдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ (рдЬреАрд╕реА) рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рд╕реАрдПрд▓рдЖрд░ рддреБрд░рдВрдд рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЗ рджреЛ рд╕реЗрдЧрдореЗрдВрдЯ - рдЫреЛрдЯреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАрдк рдФрд░ рд▓рд╛рд░реНрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАрдк рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рддреНрд╡рд░рд┐рдд рдЯрд┐рдкреНрдкрдгреА: рдЖрднрд╛рд╕реА рд╕реНрдореГрддрд┐ рд╕реНрдореГрддрд┐ рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ, рднреМрддрд┐рдХ рдирд╣реАрдВред рднреМрддрд┐рдХ рд╕реНрдореГрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреЗрдЬрд┐рдиреЗрд╢рди (x86, IA-64, PowerPC-64 рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 4kB, SPCC - 8 KB) рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрддрдо рдкрддрд╛ рдпреЛрдЧреНрдп рдЖрдХрд╛рд░ (32-рдмрд┐рдЯ OS рдХреЗ рд▓рд┐рдП 4GB) рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддрд╛ рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрддреЗ рд╕реНрдерд╛рди рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдбрд┐рд╕реНрдХ рдкрд░ рд╕реНрд╡реИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реНрдореГрддрд┐ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, GC Win32 рдлрд╝рдВрдХреНрд╢рди
VirtualAlloc рдФрд░
VirtualFree рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
.NET рдореЗрдВ рдЧрд╛рд░рдмреЗрдЬ рдХрд▓реЗрдХреНрдЯрд░ рдЬреЗрдирд░реЗрд╢рдирд▓ рд╣реИ, рдЕрд░реНрдерд╛рдд рдкреНрд░рдмрдВрдзрд┐рдд рд╣реАрдк (рдХреНрд░рдорд╢рдГ, рдСрдмреНрдЬреЗрдХреНрдЯ) рдкреАрдврд╝рд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИред рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреАрд╡рди рдЪрдХреНрд░ рдореЗрдВ рдХрдИ рдкреАрдврд╝рд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╕реНрддреБ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рд╕реНрд░реЛрдд рддрдерд╛рдХрдерд┐рдд рдЬреАрд╕реА рдЬрдбрд╝реЗрдВ рд╣реИрдВ:
- рдвреЗрд░
- рд╕реНрдерд┐рд░ (рд╡реИрд╢реНрд╡рд┐рдХ) рд╡рд╕реНрддреБрдПрдВ
- рдЕрдВрддрд┐рдо рд╡рд╕реНрддреБрдПрдБ
- рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░реЛрдк рдСрдмреНрдЬреЗрдХреНрдЯ (COM / рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЙрд▓ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ CLR)
- рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░
- рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕реАрдПрд▓рдЖрд░
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрд▓ 3 рдкреАрдврд╝рд┐рдпрд╛рдБ рд╣реИрдВ:
- рд╕реГрдЬрди реж ред рдЗрд╕ рдкреАрдврд╝реА рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, Gen0 рддрд░реАрдХреЛрдВ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
- рдкреАрдврд╝реА рез ред рдЗрд╕ рдкреАрдврд╝реА рдХрд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рднреА рдЫреЛрдЯрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдЬреАрд╡рдирдХрд╛рд▓ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - Gen0 рд╕реЗ Gen2 рддрдХ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдБред
- рдкреАрдврд╝реА реи ред рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬреАрд╡рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 85,000 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдбрд╝реА рд╡рд╕реНрддреБрдПрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рд░реНрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАрдк рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ Gen2 рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реЛрддреА рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб (SOH, LOH) рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрдХрд╛рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╢реАрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд▓рд┐рдП 16 рдПрдордмреА рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП 64 рдПрдордмреА)ред рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣
рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рд╣реИ - рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдорд╛рдиреНрдп
рд░реВрдк рд╕реЗ 5 рдПрдордмреА
рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдСрдмреНрдЬреЗрдХреНрдЯ рди рдХреЗрд╡рд▓ 85,000 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдбрд╝реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ LOH рдореЗрдВ рднреА рдорд┐рд▓рддреЗ рд╣реИрдВред
рддреЛ 10,600 рддрддреНрд╡реЛрдВ (85000/8 рдмрд╛рдЗрдЯреНрд╕) рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде System.Double рд╕реЗ рдПрдХ рд╕рд░рдгреА LOH рдореЗрдВ рдЧрд┐рд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 1000+ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рдмрдВрдзрд┐рдд рдвреЗрд░ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ, рдпрджрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдЦрдВрдбрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реАрдПрд▓рдЖрд░ -
рд╣рдореЗрд╢рд╛ (рдореИрдиреБрдЕрд▓ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде) рдЫреЛрдЯреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАрдк рдХреЛ рдбреАрдлрд╝реНрд░реИрдЧреНрдореЗрдиреНрдЯ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореБрдХреНрдд рдореЗрдореЛрд░реА (рдвреЗрд░ рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ) рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдиреНрдпреВрдирддрдо рдореЗрдореЛрд░реА рдЦрдкрдд рд╣рд╛рд╕рд┐рд▓ рдХреА рдЬрд╛рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ Gen0, Gen1 рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рджреЗрд░реА рдХреЗрд╡рд▓
1 ms рдХреА рд╣реИ ред
рдмрдбрд╝реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реАрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣ рдХрднреА рднреА рдбреАрдлрд╝реНрд░реЗрдЧреНрдореЗрдВрдЯреЗрдб (рд▓рдЧрднрдЧ рдХрднреА рдирд╣реАрдВ) рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдкреВрд░реНрдг-рдЬреАрд╕реА (Gen0, Gen1, Gen2) рдХреЗ рджреМрд░рд╛рди, рд╕рд┐рд╕реНрдЯрдо рдЕрднреА рднреА рдУрдПрд╕ рдореЗрдореЛрд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд▓рдУрдПрдЪ (рдпрд╛ рдбреАрдПрдл рдХреЛ рдбреАрдлрд╝реНрд░реИрдЧреНрдореЗрдВрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ) рд╕реЗ рдореГрдд рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, CLR LOH рдореЗрдВ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рди рдХреЗрд╡рд▓ рдПрд╕рдПрдЪрдПрдЪ рдореЗрдВ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░рдЦрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдлреБрд▓-рдЬреАрд╕реА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдореБрдлреНрдд рдореЗрдореЛрд░реА рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рднреАред
GC рд▓реЙрдиреНрдЪ рдирд┐рдпрддрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИ, рдЬреЛ GC.Collect () рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрднреА рднреА рдЕрдиреБрдорд╛рдирд┐рдд рдорд╛рдирджрдВрдб рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╢рд░реНрддреЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВ рдФрд░ рд╕реАрдПрд▓рдЖрд░ рд╕реНрд╡рдпрдВ рдЖрд╡реЗрджрди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:
- Gen0 256 рдХреЗрдмреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░
- рдЬрдм Gen1 Generation 2 MB рддрдХ рдкрд╣реБрдБрдЪ рдЬрд╛рддрд╛ рд╣реИ
- 10 рдПрдордмреА рдЬреЗрди 2 рдЬреЗрдирд░реЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрдирд╛
рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рднреА рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕рд┐рд╕реНрдЯрдо рд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред CLR рдЗрд╕рдХреЗ рд▓рд┐рдП Win32 рдлрд╝рдВрдХреНрд╢рди
CreateMemoryResourceNotification рдФрд░
QueryMemoryResourceNotification рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рдЬрдм рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдорд╛рдирд╡ рд░рд╣рд┐рдд рд╕рдВрд╕рд╛рдзрди рдореЗрдВ рдХреЛрдИ рднреА рд╡рд╕реНрддреБ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЪрд╛рд╣реЗ рдЙрдирдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдХреБрдЫ рднреА рд╣реЛ рдФрд░ GC рдирд┐рдпрддрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИ, рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рд╣реИред
рдЬрдм рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╕реАрдПрд▓рдЖрд░ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреАрдврд╝рд┐рдпреЛрдВ рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВ)ред
рдЬреАрд╕реА рдЦрддреНрдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдВрддрд┐рдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ)ред
рдбрд┐рд╕реНрдкреЛрдЬрд╝рд▓ рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
class Foo : IDisposable { private bool _disposed; ~Foo() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) {
рдЕрдм .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЙрдкрд▓рдмреНрдз GCs рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
.NET 4.0 рд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рд╕рд░реНрд╡рд░ рдФрд░ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдореЛрдб рдЙрдкрд▓рдмреНрдз рдереЗред
рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдореЛрдб - рдЬреАрд╕реА рдЧреНрд░рд╛рд╣рдХ рдорд╢реАрдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред рд╡рд╣ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЕрдзрд┐рдХ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рджреЗрд░реА рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рджреЛ рдореЛрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ - рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХред
рд╕рдорд╛рдирд╛рдВрддрд░ рдореЛрдб рдореЗрдВ, рдЬреАрд╕реА 2 рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб (рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде) рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкрдВрдЪрд╛рдВрдЧ рдкреАрдврд╝рд┐рдпреЛрдВ рдХреЗ рдХрд╛рдо рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ (рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЖрд╡рдВрдЯрди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдереНрд░реЗрдб рдирд┐рд▓рдВрдмрд┐рдд рд╣реИрдВ)ред
рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ (!!!) рдмрд╣реБрдд рд╕рд╛рд░реА рдореБрдлреНрдд рдореЗрдореЛрд░реА рд╣реИ, рддреЛ рдПрд╕рдУрдПрдЪ рдХреЙрдореНрдкреИрдХреНрдЯ рдирд╣реАрдВ рдмрди рдЬрд╛рддрд╛ рд╣реИ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЬрд╡рд╛рдмрджреЗрд╣реА рдХреЗ рд▓рд┐рдП рдЬреАрд╕реА рдмрд▓рд┐рджрд╛рди рдореЗрдореЛрд░реА)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, GUI рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдореЛрдб рдЖрджрд░реНрд╢ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб GC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<configuration> <runtime> <gcServer enabled="true"/> </runtime> </configuration>
рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЛрдб рдореЗрдВ GCSettings.IsServerGC рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рд╕рдорд╡рд░реНрддреА рдЬреАрд╕реА рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
<configuration> <runtime> <gcConcurrent enabled="false"/> </runtime> </configuration>
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрд╛рд░реНрдп рдХреЗрдВрджреНрд░ GC рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдореЛрдб рд╕рдХреНрд╖рдо рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рд┐рдВрдЧрд▓-рдХреЛрд░ рд╣реИ, рддреЛ рдЬреАрд╕реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рд╕рд░реНрд╡рд░ рдЬреАрд╕реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╕рд░реНрд╡рд░ GC рдкреНрд░рдмрдВрдзрд┐рдд рд╣реАрдк рдХреЛ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдВрдЦреНрдпрд╛
рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рддреНрд╡рд░рд┐рдд рдзреНрдпрд╛рди рджреЗрдВ: рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬрд░реВрд░реА рднреМрддрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред рдХрдИ рднреМрддрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ (рдпрд╛рдиреА рдХрдИ рд╕реЙрдХреЗрдЯ) рдФрд░ рдорд▓реНрдЯреА-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХрдИ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдУрдПрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрд░реНрдиреЗрд▓ (!!!) рднреА 1 рд╕реЗ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯреЗрд▓ рд╣рд╛рдЗрдкрд░-рдереНрд░реЗрдбрд┐рдВрдЧ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореБрдЦреНрдп рдЕрдВрддрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ
GCSettings.LatencyMode рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реИ, рдЬреЛ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 3.5 SP1 (рддреАрди рдореЛрдб рд╕реЗ рдпреБрдХреНрдд) рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрд╛рд░реНрдп рдХреЗрдВрджреНрд░ рд╕рдорд╡рд░реНрддреА GC рдХреЗ рд▓рд┐рдП LatencyMode рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡, рд╕рд░реНрд╡рд░ - рдмреИрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЛ-рд▓реЗрдЯреЗрдВрд╕реА рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╕реЗ рдЖрдЙрдЯрдСрдлрдореЗрдореЛрд░реА рдПрдХреНрд╕рд╕реЗрдкреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕ GC рдореЛрдб рдореЗрдВ, рдлреБрд▓ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗрд╡рд▓ рдЙрдЪреНрдЪ рдореЗрдореЛрд░реА рд▓реЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рд░реНрд╡рд░ GC рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдмреИрдЪ рдФрд░ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИ?
рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рдЬреАрд╕реА рдкреНрд░рдмрдВрдзрд┐рдд рдвреЗрд░ рдХреЛ рдХрдИ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЕрд▓рдЧ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ), рдлрд┐рд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ (рдпрджрд┐ рдПрдХ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдореЛрдб gcConcurrent рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ gCConcurrent рдореЛрдб рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдмреИрдЪ рдореЛрдб рд╕рдорд╛рдирд╛рдВрддрд░ (!!!) рдореЗрдВ рдЖрдЧреЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред рдмреИрдЪ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдкрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдбреЗрдЯрд╛ рдХреЗ рдмрдбрд╝реЗ (!!!) рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ GCLatencyMode рдорд╛рди рдХреЛ рдмрджрд▓рдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдбред
рдФрд░ рдХрдм рд╕реЗ рдЪреВрдВрдХрд┐ рдзрд╛рдЧреЗ рд╡рд┐рднрд┐рдиреНрди рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬреАрд╕реА рдореЛрдб рдХреЗ рддрддреНрдХрд╛рд▓ рдЕрдиреБрд╡рд╛рдж рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ 100 рдзрд╛рдЧреЗ рд╣реИрдВ?
рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЪрд▓ рд░рд╣реА рд╣реИ? рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реАрдПрд▓рдЖрд░ рдХреЗ рд▓рд┐рдП - рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рдЕрдкрд╡рд╛рдж рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рд╣реА рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рдирд╣реАрдВред
рдпрд╣ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╡рд╢ рдирд┐рд╖реНрдкрд╛рджрди рдХреНрд╖реЗрддреНрд░ (рд╕реАрдИрдЖрд░) рд╣реИ - рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ (рджреЛрдиреЛрдВ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ) рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред
рд╕реАрдИрдЖрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХреЛрдб рдмреНрд▓реЙрдХ рдореЗрдВ, рд░рдирдЯрд╛рдЗрдо рдХреЛ рдХреБрдЫ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм Thread.Abort () рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ CER рдХреЗ рддрд╣рдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдПрдХ рдзрд╛рдЧрд╛ рддрдм рддрдХ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ CER- рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, CLR рд╕реНрдореГрддрд┐ рдХреА рдХрдореА рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрд╢рди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╕реАрдИрдЖрд░ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рдмрдбрд╝реЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП CER рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд┐рдпрд╛ рдЬрд╛рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВ: рдореБрдХреНрдХреЗрдмрд╛рдЬреА, рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛, рдореЙрдирд┐рдЯрд░.рдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЖрджрд┐ред
рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рддрд▓реНрд▓реАрди рди рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рд▓реЕрдЯреЗрдВрд╕реАрдореЛрдб рдореЛрдб рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПред
var oldMode = GCSettings.LatencyMode; System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions(); try { GCSettings.LatencyMode = GCLatencyMode.Batch;
рдЦреИрд░, рд╣рдордиреЗ .NET рдореЗрдВ GC рдХреЗ рдХрд╛рдо рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреА рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рдВрдЪ рдХрд░ рд▓реА рд╣реИ - рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ?
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ? рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?
рд╣рдореНрдо ... рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдВрдЪрд╛рдВрдЧ рдкреАрдврд╝рд┐рдпреЛрдВ рдореЗрдВ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдХрд╛ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдерд╛?
рдФрд░ рдпрд╣рд╛рдБ .NET рдХрдорд╛рдВрдб рд╣реИ - рд╣рд╛рдБ :)
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдореЛрдб (.NET 4.5 рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ) рдХреЗ рд▓рд┐рдП рдирдП рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреАрд╕реА рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред
рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Gen2 рдореЗрдВ рдкреВрд░реНрдг-рдЬреАрд╕реА рдХреЗ рд╕рд╛рде рджреЗрд░реА рдХреЛ рдХрдо рдХрд░рдирд╛ рдерд╛ред
рдкреГрд╖реНрдарднреВрдорд┐ рдЬреАрд╕реА рдПрдХ рд╣реА рд╕рдорд╡рд░реНрддреА рдЬреАрд╕реА рд╣реИ, рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде - рдкреВрд░реНрдг-рдЬреАрд╕реА рдХреЗ рд╕рд╛рде, рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдВрдЪрд╛рдВрдЧ рдкреАрдврд╝рд┐рдпреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╣рдордд рд╣реВрдБ рдХрд┐ Gen2 рдФрд░ LOH рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдХрд╛рдлреА рдорд╣рдВрдЧрд╛ рд╣реИред рдФрд░ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ Gen0, Gen1 - рдЕрд░реНрдерд╛рдд рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рджреЗрд░реА (рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ) рд╣реЛ рд╕рдХрддреА рд╣реИред
рдирдП GC рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рд╣реИ рдЬрдм рдкреНрд░рдмрдВрдзрд┐рдд рд╣реАрдк рдХрд╛ рдЖрдХрд╛рд░ (16 рдПрдордмреА - рдбреЗрд╕реНрдХрдЯреЙрдк, 64 - рд╕рд░реНрд╡рд░) рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИред

рдЕрдм, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рди рдХреЗрд╡рд▓ Gen2 рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб, рдмрд▓реНрдХрд┐ рдЕрдЧреНрд░рдЧрд╛рдореА рдзрд╛рдЧрд╛ (рд╣рд╛рдБ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднреА рдлреЛрд░рдЧреНрд░рд╛рдЙрдВрдб GC рд╣реИ), рдЬреЛ рдкрдВрдЪрд╛рдВрдЧ рдкреАрдврд╝рд┐рдпреЛрдВ рд╕реЗ рдореГрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ Gen2 рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдкрдВрдЪрд╛рдВрдЧ рдкреАрдврд╝рд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ .combining рдХреЙрдкреА рдХрд░рдиреЗ рд╕реЗ рдХрдо рдЦрд░реНрдЪреАрд▓рд╛ рдСрдкрд░реЗрд╢рди рд╣реИ) рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдереНрд░реЗрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб GC Gen0 рдореЗрдВ Gen1 рдХреЛ Gen2 рдХреЗ рд▓рд┐рдП GC рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рд╡рд┐рд▓рдВрдм рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдореА рдХреА рддреБрд▓рдирд╛ рдиреАрдЪреЗ рдХреЗ рдЧреНрд░рд╛рдл рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

Management рдореИрдиреБрдЕрд▓ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди
рд╕реАрдПрд▓рдЖрд░ рдХреА рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕реА # рдореИрдиреБрдЕрд▓ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ .NET рдЯрд╛рдЗрдк-рдкреЙрдЗрдВрдЯрд░ рдЯрд╛рдЗрдк рдХрд╛ рддреАрд╕рд░рд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП DWORD рдкрддреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рд╣рдо рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред
рд▓реЗрдХрд┐рди рд╣рдо рдЕрдирд╡рд╛рдВрдЯреЗрдб рдХреЛрдб рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрд░рдЪрдирд╛ System.Runtime.InteropServices.GCHandle рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрддреЗ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдореЗрдореЛрд░реА рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
GCHandle рдХреЗ рд▓рд┐рдП, CLR рдкреНрд░рддреНрдпреЗрдХ AppDomain рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
GCHandle рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм GCHandle.Free () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЬрдм AppDomain рдЙрддрд╛рд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, GChandle.Alloc () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд╡рдВрдЯрди рдореЛрдб рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
- рд╕рд╛рдзрд╛рд░рдг
- рдХрдордЬрд╝реЛрд░
- рдХрдордЬреЛрд░ рдЯреНрд░реИрдХ рдкреБрдирд░реБрддреНрдерд╛рди
- рдкрд┐рди рдХреА рдЧрдИ
GCHandle рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА -
MSDN ред
рдЬрдм рдореИрдиреБрдЕрд▓ рдореЗрдореЛрд░реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдЖрдк рдкреВрдЫреЗрдВ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
static unsafe void Copy(byte[] source, int sourceOffset, byte[] target, int targetOffset, int count) { fixed (byte* pSource = source, pTarget = target) {
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ GC SOH рдХреЛ рдбреАрдлрд╝реНрд░реИрдЧреНрдореЗрдиреНрдЯ рдХрд░рддрд╛ рд╣реИ? рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдвреЗрд░ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рд╕реЗ рдПрд╕рдУрдПрдЪ рдХреЗ рдЕрдпреЛрдЧреНрдп рдбреАрдлрд╝реНрд░реИрдЧреНрдореЗрдиреНрдЯреЗрд╢рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрддреЗ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ (.NET рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реНрд╡рдпрдВ рд▓рд┐рдВрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЕрдирд╡рд╛рдВрдЯреЗрдб рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдиреБрдореЗрдп рдирд╣реАрдВ рд╣реИред|| рдХреВрдбрд╝рд╛ рдЙрдард╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛ рдЙрдЪрд┐рдд рд╡рд┐рдиреНрдпрд╛рд╕ || .NET 4.0+ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди
.NET 2.0 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреА рдПрдХ рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓рдиреЗ рдпрд╛ рдлрд┐рд░ рд╕реЗ рдЬрдорд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╕рд╛рдиреА рд╕реЗ .NET 4.0 рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
[ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ ].NET 1.1 рдХреЛ рд╕рдореАрдХреНрд╖рд╛ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЖрдзреБрдирд┐рдХ рдЬрд┐рд╕реЗ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рд╡рд╣ рд╕рдВрд╕реНрдХрд░рдг реи.реж рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред.NET 3.5 рдореЗрдВ CLR 2.0, рд╕рдВрд╕реНрдХрд░рдг 2.0 + рдирдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА 3.0 + 3.5 рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдореЗрдореЛрд░реА рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди, рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ, рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЖрджрд┐ред рдирд╣реАрдВ рд╣реБрдЖредрд▓реЗрдХрд┐рди .NET 4.0 рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдирд╡рд╛рдЪрд╛рд░ рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реИ:- рдирдпрд╛ рд╕реАрдПрд▓рдЖрд░
- рдирдпрд╛ рдЬреАрд╕реА
- рдирдИ рдкреНрд░рдгрд╛рд▓реА рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░рдгрд╛рд▓реА
- рдирдпрд╛ рдзрд╛рдЧрд╛ рдкреВрд▓
- рдирдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓
CLR 4.0 рдХреЗ рддрд╣рдд CLR 2.0 рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ: <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
рдкреБрд░рд╛рдиреЗ рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: <runtime> <NetFx40_LegacySecurityPolicy enabled="true"/> </runtime>
рд╕рд┐рд╕реНрдЯрдо рдПрд╕рдИрдПрдЪ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдмрджрд▓ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: <configuration> <runtime> <legacyCorruptedStateExceptionsPolicy enabled="true"/> </runtime> </configuration>
рдпрджрд┐ рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рднреА рдореВрд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ: <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup>
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрдб рдХреА рдПрдХ рднреА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдкреБрди: рдЬрдорд╛ рдХрд┐рдП рдмрд┐рдирд╛, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ .NET 4.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредOr рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░ || FastCall
JIT рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрдХреВрд▓рди VC ++ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдирд┐рд╣рд┐рдд рдЕрдиреБрдХреВрд▓рди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ FastCallредрд╡рд┐рдзрд┐ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдкрд╣рд▓реЗ 2 рдкреИрд░рд╛рдореАрдЯрд░ рдИрд╕реАрдПрдХреНрд╕, рдИрдбреАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВредX64 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде - RCX, RDX, R8, R9 рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдпрд╣ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ?рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рднрд▓реЗ рд╣реА рдпрд╣ рдорд╛рдЗрдХреНрд░реЛрдПрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рд╣реЛ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА)ред class Program { static void Main(string[] args) { int startIndex = 1; int endIndex = 2; int x = 3; int y = 5; int result = Compute(startIndex, endIndex, x, y); Console.WriteLine(result); } public static int Compute(int startIndex, int endIndex, int x, int y) { int result = 0; for (int i = startIndex; i < endIndex; i++) { result += x * startIndex + y * endIndex; } return result; } }
рддреЛ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рд▓рд┐рдП, рд╡реИрд░рд┐рдПрдмрд▓ startIndex рдФрд░ endIndex ECX, EDX рд░рдЬрд┐рд╕реНрдЯрд░, рдмрд╛рдХреА (x, y) рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗредрдЪреЗрдХ рдХрд░реЗрдВ - рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рдмрдЧрд░ рдЪрд▓рд╛рдПрдВредрд╡рд░реНрддрдорд╛рди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдЯрд╛рдЗрдк рдХрд░реЗрдВ CTRL + D, R
ред
рдЙрддреНрдкрдиреНрди рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП CTRL + ALT + D
ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛!рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!