Senior
Kako se vrši deljenje objekata u hrpama?
sobes.tech АИ
Одговор од АИ
U .NET-u, hrpa (heap) je podeljena na dve glavne generacije: Generaciju 0 i Generaciju 1. Ako je potrebno, kreira se Generacija 2.
- Generacija 0 (Gen 0): Ovde se smeštaju nedavno kreirani objekti. To je najmlađa i najmanja generacija. Sakupljač smeća (GC) proverava i čisti ovu generaciju češće. Objekti koji prežive sakupljanje u Gen 0, premeštaju se u Gen 1.
- Generacija 1 (Gen 1): Sadrži objekte koji su preživeli sakupljanje u Gen 0. GC proverava ovu generaciju ređe nego Gen 0. Objekti koji prežive sakupljanje u Gen 1, premeštaju se u Gen 2.
- Generacija 2 (Gen 2): Sadrži dugotrajne objekte iz Gen 1, kao i velike objekte. GC proverava ovu generaciju najređe. Sakupljanje u Gen 2 je najskuplje po vremenu.
- Heap za velike objekte (LOH): Posebna oblast na hrpi za objekte veličine 85 KB ili više. Objekti u LOH se ne premeštaju od strane GC, jer je njihovo premeštanje veoma skupo. Čišćenje LOH-a se obavlja zajedno sa sakupljanjem u Gen 2.
Podela na generacije zasniva se na hipotezi da nedavno kreirani objekti najčešće postaju smeće brže nego dugotrajni. Takav pristup omogućava GC efikasno čišćenje memorije, fokusirajući se na najmlađe generacije.
// Primer kreiranja objekata u Generaciji 0
object obj1 = new object();
string str1 = "Hello";
// Nakon prve sakupljanja smeća u Gen 0, ako su obj1 i str1 još uvek potrebni,
// oni mogu biti premešteni u Gen 1.
// Dugotrajni objekat
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
longLivedList.Add(i);
}
// Ovaj spisak vremenom može porasti do Gen 2.
// Veliki objekat, koji će biti smešten u LOH
byte[] largeArray = new byte[100 * 1024]; // Veličina > 85 KB