Sobes.tech
Senior

Cum are loc divizarea obiectelor în heap-uri?

sobes.tech AI

Răspuns de la AI

În .NET, heap-ul (stiva) este împărțit în două generații principale: Generatia 0 și Generatia 1. Dacă este necesar, se creează Generatia 2.

  • Generatia 0 (Gen 0): Obiectele nou create sunt plasate aici. Este cea mai tânără și cea mai mică generație. Colectorul de gunoi (GC) verifică și curăță această generație cel mai frecvent. Obiectele care supraviețuiesc colectării în Gen 0 sunt mutate în Gen 1.
  • Generatia 1 (Gen 1): Conține obiecte care au supraviețuit colectării în Gen 0. GC verifică această generație mai rar decât Gen 0. Obiectele care supraviețuiesc colectării în Gen 1 sunt mutate în Gen 2.
  • Generatia 2 (Gen 2): Conține obiecte de lungă durată din Gen 1, precum și obiecte mari. GC verifică această generație cel mai rar. Colectarea în Gen 2 este cea mai costisitoare în timp.
  • Heap pentru Obiecte Mari (LOH): O zonă specială a heap-ului pentru obiecte de 85 KB sau mai mult. Obiectele din LOH nu sunt mutate de GC, deoarece mutarea lor este foarte costisitoare. Curățarea LOH are loc împreună cu colectarea din Gen 2.

Divizarea în generații se bazează pe ipoteza că obiectele create recent devin mai repede gunoi decât cele de lungă durată. Această abordare permite GC să curețe eficient memoria, concentrându-se pe cele mai tinere generații.

// Exemplu de creare a obiectelor în Generatia 0
object obj1 = new object();
string str1 = "Hello";

// După prima colectare de gunoi în Gen 0, dacă obj1 și str1 sunt încă necesare,
// ele pot fi mutate în Generatia 1.

// Obiect de lungă durată
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// Această listă poate urca în Generatia 2 în timp.

// Obiect mare, care va fi plasat în LOH
byte[] largeArray = new byte[100 * 1024]; // Dimensiune > 85 KB