Sobes.tech
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 ԿԲ