Senior
Ինչպես է տեղի ունենում օբյեկտների բաժանումը հողամասերում?
sobes.tech AI
Պատասխան AI-ից
Դ .NET-ում, heap-ը (հավաքածուն) բաժանվում է երկու հիմնական սերնդի՝ Սերունդ 0 և Սերունդ 1։ Անհրաժեշտության դեպքում ստեղծվում է Սերունդ 2։
- Սերունդ 0 (Gen 0): Այստեղ տեղադրվում են նոր ստեղծված օբյեկտները։ Դա ամենաերիտասարդ և ամենափոքր սերունդն է։ Գործողության հավաքիչը (GC) առավել հաճախ ստուգում և մաքուր է այս սերնդից։ Օբյեկտները, որոնք անց survive են Gen 0-ի հավաքածուից, տեղափոխվում են Gen 1։
- Սերունդ 1 (Gen 1): Ունի այն օբյեկտները, որոնք անց survive են Gen 0-ի հավաքածուից։ GC-ն այս սերնդին ավելի քիչ է ստուգում, քան Gen 0-ը։ Օբյեկտները, որոնք անց survive են Gen 1-ի հավաքածուից, տեղափոխվում են Gen 2։
- Սերունդ 2 (Gen 2): Ունի երկարատև օբյեկտները Gen 1-ից, ինչպես նաև մեծ օբյեկտները։ GC-ն այս սերնդին ամենաքիչ է ստուգում։ Gen 2-ի հավաքածուն ամենաշատ ժամանակ է պահանջում։
- Մեծ օբյեկտների հող (LOH): Հատուկ տարածք heap-ում՝ օբյեկտների համար չափսը 85 ԿԲ կամ ավելի։ LOH-ում գտնվող օբյեկտները GC-ն չեն տեղափոխում, քանի որ նրանց տեղափոխումը շատ թանկ է։ LOH-ի մաքրման գործընթացը կատարվում է միասին Gen 2-ի հավաքածուի հետ։
Սերունդների բաժանումը հիմնված է այն ենթադրության վրա, որ վերջերս ստեղծված օբյեկտները հաճախ ավելի արագ են դառնում աղբ, քան երկարատև օբյեկտները։ Այս մոտեցումը թույլ է տալիս GC-ին արդյունավետորեն մաքրել հիշողությունը՝ կենտրոնանալով ամենաերիտասարդ սերունդների վրա։
// Օրինակ՝ նոր օբյեկտների ստեղծում Սերունդ 0-ում
object obj1 = new object();
string str1 = "Hello";
// Առաջին աղբի հավաքածուից հետո, եթե obj1 և str1 դեռ անհրաժեշտ են,
// դրանք կարող են տեղափոխվել Սերունդ 1։
// Երկարատև օբյեկտ
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
longLivedList.Add(i);
}
// Այս ցուցակը ժամանակի ընթացքում կարող է բարձրանալ Սերունդ 2։
// Մեծ օբյեկտ, որը տեղադրվելու է LOH-ում
byte[] largeArray = new byte[100 * 1024]; // չափսը > 85 ԿԲ