Sobes.tech
Senior

Hogyan történik az objektumok felosztása a halmokban?

sobes.tech MI

Válasz az MI-től

A .NET-ben a halom (heap) két fő generációra oszlik: 0. generáció és 1. generáció. Szükség esetén létrejön a 2. generáció.

  • 0. generáció (Gen 0): Az itt létrehozott objektumokat helyezi el. Ez a legfiatalabb és legkisebb generáció. A szemétgyűjtő (GC) ezt a generációt gyakrabban ellenőrzi és tisztítja. A Gen 0-ban túlélő objektumokat a GC a Gen 1-be helyezi.
  • 1. generáció (Gen 1): Tartalmazza a Gen 0-ban túlélő objektumokat. A GC ezt a generációt ritkábban ellenőrzi, mint a Gen 0. A Gen 1-ben túlélő objektumokat a GC a Gen 2-be helyezi.
  • 2. generáció (Gen 2): Tartalmazza a hosszú életű objektumokat a Gen 1-ből, valamint nagyobb objektumokat. A GC ezt a generációt a legkevésbé ellenőrzi. A Gen 2-ben történő gyűjtés időigényesebb.
  • Nagy Objektum Heap (LOH): Külön terület a heap-en, 85 KB vagy nagyobb objektumok számára. A LOH-ban lévő objektumokat a GC nem mozgatja, mivel azok mozgatása nagyon költséges. A LOH tisztítása a Gen 2 gyűjtésével történik.

A generációkra bontás azon a hipotézisen alapul, hogy a nemrég létrehozott objektumok gyorsabban válnak szemétté, mint a hosszabb életűek. Ez a megközelítés lehetővé teszi a GC számára, hogy hatékonyan tisztítsa a memóriát, a legfiatalabb generációkra összpontosítva.

// Példa objektumok létrehozására a Gen 0-ban
object obj1 = new object();
string str1 = "Hello";

// Az első szemétgyűjtés után Gen 0-ban, ha az obj1 és str1 még szükségesek,
// át lehet helyezni őket a Gen 1-be.

// Hosszú életű objektum
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// Ez a lista idővel a Gen 2-be kerülhet.

// Nagy objektum, amelyet a LOH-ba helyeznek
byte[] largeArray = new byte[100 * 1024]; // Méret > 85 KB