Sobes.tech
Senior

Kuidas toimub objektide jagamine virnades?

sobes.tech AI

Vastus AI-lt

.NETi mälu (heap) jaguneb kahe põhiklassi: 0. ja 1. põlvkond. Vajadusel luuakse 2. põlvkond.

  • Põlvkond 0 (Gen 0): Siia paigutatakse loodud objektid. See on noorim ja väikseim mäluosa. Prügikoristaja (GC) kontrollib ja puhastab seda põlvkonda kõige sagedamini. Objekte, mis läbivad puhastuse Gen 0, liigutatakse Gen 1.
  • Põlvkond 1 (Gen 1): Sisaldab objekte, mis on läbinud puhastuse Gen 0. GC kontrollib seda põlvkonda harvemini kui Gen 0. Objekte, mis läbivad puhastuse Gen 1, liigutatakse Gen 2.
  • Põlvkond 2 (Gen 2): Sisaldab pikaajalisi objekte Gen 1-st ning ka suuri objekte. GC kontrollib seda põlvkonda kõige harvemini. Puhastamine Gen 2-s on kõige kulukam.
  • Suurte objektide virn (LOH): Spetsiaalne mäluala suurte objektide jaoks, mille suurus on 85 KB või rohkem. LOH-i objektid ei liigu GC-ga, kuna nende liigutamine on väga kulukas. LOH-i puhastamine toimub koos Gen 2 puhastusega.

Põlvkondade jaotamine põhineb hüpoteesil, et hiljuti loodud objektid muutuvad prügi kiiremini kui pikaajalised. Selline lähenemine võimaldab GC-l tõhusalt mälu puhastada, keskendudes kõige noorematele põlvkondadele.

// Näide, kuidas luua objekte Põlvkonnas 0
object obj1 = new object();
string str1 = "Hello";

// Pärast esimest puhastust Gen 0, kui obj1 ja str1 on endiselt vajalikud,
// võivad need liikuda Gen 1-i.

// Pikaajaline objekt
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// See nimekiri võib aja jooksul tõusta kuni Gen 2.

// Suur objekt, mis paigutatakse LOH-i
byte[] largeArray = new byte[100 * 1024]; // Suurus > 85 KB