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