Sobes.tech
Senior

Kaip vyksta objektų skirstymas į krūvas?

sobes.tech AI

Atsakymas iš AI

„.NET“ atmintyje (heap) yra du pagrindiniai kartos: 0 ir 1 karta. Jei reikia, sukurta 2 karta.

  • 0 karta (Gen 0): Čia yra naujai sukurti objektai. Tai jauniausia ir mažiausia atminties dalis. Atminties rinkėjas (GC) dažniausiai tikrina ir valo šią kartą. Objektai, išgyvenę rinkimą Gen 0, perkeliami į Gen 1.
  • 1 karta (Gen 1): Apima objektus, išgyvenusius rinkimą Gen 0. GC tikrina šią kartą rečiau nei Gen 0. Objektai, išgyvenę rinkimą Gen 1, perkeliami į Gen 2.
  • 2 karta (Gen 2): Apima ilgalaikius objektus iš Gen 1, taip pat didelius objektus. GC tikrina šią kartą rečiausiai. Rinkimas Gen 2 yra laiko atžvilgiu brangiausias.
  • Didelių objektų krūva (LOH): Speciali atminties sritis skirta objektams, kurių dydis yra 85 KB ar daugiau. Objektai LOH nėra perkeliami GC, nes jų perkėlimas yra labai brangus. LOH valymas vyksta kartu su Gen 2 rinkimu.

Kartos yra pagrįstos hipoteze, kad neseniai sukurti objektai dažniau tampa šiukšle greičiau nei ilgalaikiai. Šis požiūris leidžia GC efektyviai valyti atmintį, sutelkiant dėmesį į jauniausias kartas.

// Pavyzdys, kaip kurti objektus 0 kartoje
object obj1 = new object();
string str1 = "Hello";

// Po pirmojo rinkimo Gen 0, jei obj1 ir str1 vis dar reikalingi,
// jie gali būti perkeliami į Gen 1.

// Ilgalaikis objektas
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// Šis sąrašas laikui bėgant gali pakilti į Gen 2.

// Didelis objektas, kuris bus išdėstytas LOH
byte[] largeArray = new byte[100 * 1024]; // Dydis > 85 KB