Senior
Obyektlarning to'plamlarda bo'linishi qanday amalga oshiriladi?
sobes.tech AI
AIdan javob
.NET da, yuvinish (heap) ikki asosiy avlodga bo'linadi: 0 va 1-avlod. Zarur bo'lsa, 2-avlod yaratiladi.
- 0-avlod (Gen 0): Yangi yaratilgan obyektlar bu yerga joylashtiriladi. Bu eng yosh va kichik yuvin. Garbage collector (GC) bu avlodni ko'proq tekshiradi va tozalaydi. Gen 0 da qolgan obyektlar Gen 1 ga o'tkaziladi.
- 1-avlod (Gen 1): Gen 0 da to'planadigan obyektlarni o'z ichiga oladi. GC bu avlodni Gen 0 ga qaraganda kamroq tekshiradi. 1-avlodda qolgan obyektlar Gen 2 ga o'tkaziladi.
- 2-avlod (Gen 2): Gen 1 dan uzoq umr ko'radigan obyektlar va katta obyektlarni o'z ichiga oladi. GC bu avlodni eng kam tekshiradi. Gen 2 da to'planish eng qimmatli.
- Katta obyektlar yoshi (LOH): 85 KB yoki undan katta obyektlar uchun maxsus hudud. LOH dagi obyektlar GC tomonidan ko'chirilmaydi, chunki ularni ko'chirish juda qimmatga tushadi. LOH tozalash Gen 2 bilan birga amalga oshiriladi.
Avlodlarga bo'linish, yaqinda yaratilgan obyektlar tezroq axlatga aylanishi mumkinligiga asoslangan. Bu yondashuv GC'ga xotirani samarali tozalash imkonini beradi, eng yosh avlodlarga e'tibor qaratadi.
// 0-avlodda obyektlar yaratish misoli
object obj1 = new object();
string str1 = "Hello";
// Birinchi axlat to'plashdan so'ng, agar obj1 va str1 hali kerak bo'lsa,
// ular 1-avlodga o'tkazilishi mumkin.
// Uzoq umrli obyekt
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
longLivedList.Add(i);
}
// Bu ro'yxat vaqt o'tishi bilan 2-avlodga ko'tarilishi mumkin.
// Katta obyekt, LOH ga joylashtiriladi
byte[] largeArray = new byte[100 * 1024]; // Hajmi > 85 KB