Senior
როგორ ხდება ობიექტების დაყოფა ჰეფებში?
sobes.tech AI
პასუხი AI-სგან
.NET-те, heap (жинақ) екі негізгі ұрпаққа бөлінеді: 0-ші ұрпақ және 1-ші ұрпақ. Қажет болған жағдайда, 2-ші ұрпақ құрылады.
- 0-ші ұрпақ (Gen 0): Жаңа жасалған объектілер мұнда орналастырылады. Бұл ең жас және ең кішкентай ұрпақ. Қоқыс жинағыш (GC) бұл ұрпақты жиі тексереді және тазалайды. Gen 0-да қалған объектілер Gen 1-ге көшіріледі.
- 1-ші ұрпақ (Gen 1): Gen 0-да жинақталған объектілерді қамтиды. GC бұл ұрпақты Gen 0-ға қарағанда сирек тексереді. Gen 1-да қалған объектілер Gen 2-ге көшіріледі.
- 2-ші ұрпақ (Gen 2): Gen 1-ден ұзақ өмір сүретін объектілерді және үлкен объектілерді қамтиды. GC бұл ұрпақты ең сирек тексереді. Gen 2-дегі жинау ең көп уақыт алады.
- Үлкен объектілердің heap-і (LOH): 85 КБ немесе одан үлкен объектілер үшін арнайы аймақ. LOH-дағы объектілер GC арқылы орын ауыстырылмайды, себебі олардың орын ауыстыруы өте қымбатқа түседі. LOH-ды тазалау Gen 2-мен бірге жүзеге асырылады.
Ұрпақтарға бөлу гипотезасына негізделген, ол жақында жасалған объектілер ұзақ өмір сүретіндерге қарағанда тезірек қоқысқа айналады деп саналады. Бұл тәсіл GC-ге жадыны тиімді тазартуға мүмкіндік береді, ең жас ұрпақтарға назар аударады.
// Gen 0-да объектілерді құру мысалы
object obj1 = new object();
string str1 = "Hello";
// Бірінші қоқыс жинауынан кейін, егер obj1 және str1 әлі қажет болса,
// оларды Gen 1-ге көшіруге болады.
// Ұзақ өмір сүретін объект
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
longLivedList.Add(i);
}
// Бұл тізім уақыт өте келе Gen 2-ге көтерілуі мүмкін.
// Үлкен объект, ол LOH-ға орналастырылады
byte[] largeArray = new byte[100 * 1024]; // Өлшемі > 85 КБ