Sobes.tech
Senior

Kā notiek objektu sadalīšana kaudzēs?

sobes.tech AI

Atbilde no AI

.NET atmiņā (heap) ir divas galvenās paaudzes: Paaudze 0 un Paaudze 1. Ja nepieciešams, tiek izveidota Paaudze 2.

  • Paaudze 0 (Gen 0): Šeit tiek izvietoti jauni objekti. Tā ir jaunākā un mazākā atmiņas daļa. Atkritumu savācējs (GC) visbiežāk pārbauda un notīra šo paaudzi. Objekti, kas izdzīvo pārbaudi Gen 0, tiek pārvietoti uz Gen 1.
  • Paaudze 1 (Gen 1): Satur objektus, kas izdzīvojuši pārbaudi Gen 0. GC šo paaudzi pārbauda retāk nekā Gen 0. Objekti, kas izdzīvojuši pārbaudi Gen 1, tiek pārvietoti uz Gen 2.
  • Paaudze 2 (Gen 2): Satur ilgdzīvojošus objektus no Gen 1, kā arī lielus objektus. GC šo paaudzi pārbauda retāk nekā pārējās. Pārbaude Gen 2 ir visilgākā un dārgākā.
  • Lielu objektu krava (LOH): Specializēta atmiņas zona lieliem objektiem ar izmēru 85 KB vai vairāk. Objekti LOH netiek pārvietoti GC, jo to pārvietošana ir ļoti dārga. LOH tīrīšana notiek kopā ar Gen 2 pārbaudi.

Paaudžu sadalījums balstās uz pieņēmumu, ka nesen izveidotie objekti biežāk kļūst par atkritumiem ātrāk nekā ilgdzīvojošie. Šis pieejas veids ļauj GC efektīvi notīrīt atmiņu, koncentrējoties uz jaunākajām paaudzēm.

// Piemērs, kā izveidot objektus Paaudze 0
object obj1 = new object();
string str1 = "Hello";

// Pēc pirmās pārbaudes Gen 0, ja obj1 un str1 vēl ir nepieciešami,
// tie var tikt pārvietoti uz Gen 1.

// Ilgdzīvojošs objekts
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// Šis saraksts laika gaitā var pacelties līdz Gen 2.

// Liels objekts, kas tiks izvietots LOH
byte[] largeArray = new byte[100 * 1024]; // Izmērs > 85 KB