Sobes.tech
Middle+

Miért szükséges a Large Object Heap és a Small Object Heap szétválasztása a .NET-ben?

sobes.tech MI

Válasz az MI-től

A LOH és SOH heapek szétválasztása optimalizálja a memóriakezelést különböző méretű objektumok esetén.

Small Object Heap (SOH)

  • Olyan objektumokat tárol, amelyek mérete legfeljebb 85 KB.
  • Generációs szemétgyűjtőt (Generational Garbage Collection - GC) használ.
  • A nemrég létrehozott objektumok az 0. generációba kerülnek. A túlélő objektumok a 1. generációba, majd a 2. generációba kerülnek.
  • A szemétgyűjtés gyakrabban és hatékonyabban történik a kis objektumok esetén.
// Példa objektum létrehozására SOH-on
string smallString = "Ez egy kis szöveg"; // Kevesebb, mint 85 KB
object smallObject = new object(); // Kis objektum

Large Object Heap (LOH)

  • Olyan objektumokat tárol, amelyek mérete 85 KB vagy nagyobb.
  • Nem generációs a SOH-hoz hasonlóan. Általában csak teljes szemétgyűjtéskor (2. generáció) tisztul.
  • A memória foglalása LOH-on lassabb lehet a folyamatos memória blokk keresése miatt.
  • A LOH fragmentációja problémákat okozhat a nagyobb objektumok lefoglalásában, még akkor is, ha összességében elegendő szabad memória áll rendelkezésre.
  • A LOH-on lévő objektumokat a GC alapértelmezés szerint nem mozgatja (a .NET Framework 4.5.1-től lehetőség van a LOH tömörítésére, de ez alapértelmezés szerint ki van kapcsolva, és saját költségei vannak). Ez megakadályozza a nagy adatmennyiség költséges másolását.
// Példa objektum létrehozására LOH-on
byte[] largeArray = new byte[100 * 1024]; // 100 KB méretű, > 85 KB

Az elkülönítés előnyei

  1. Szemétgyűjtés optimalizálása: A generációs GC hatékonyabb a SOH kis, rövid életű objektumai esetén. A SOH-on lévő objektumok mozgatása viszonylag gyors.
  2. A SOH fragmentációjának csökkentése: A nagyobb objektumok mozgatása rendkívül költséges lenne, és erős fragmentációt okozna a SOH-ban. Ezek külön heapen való elhelyezése megoldja ezt a problémát.
  3. Költségek minimalizálása: A nagyobb objektumok LOH-ra helyezése jelentős költségeket jelentene a mozgatás miatt. Az alapértelmezett GC nem mozgatja ezeket, így ez a költség elkerülhető.
  4. Memóriafoglalási teljesítmény javítása: A SOH gyorsan foglalható (mutatóval), míg a LOH-on a megfelelő szabad blokk keresése időigényes lehet. Az elkülönítés megőrzi a gyors foglalási sebességet a legtöbb (kisebb) objektumnál.
Jellemzők Small Object Heap (SOH) Large Object Heap (LOH)
Objektum mérete Legfeljebb 85 KB 85 KB vagy több
GC modell Generációs (0, 1, 2 generációk) Nem generációs (alapértelmezett)
Objektumok mozgatása Igen (összepréselés) Nem (alapértelmezett)
Tisztítás gyakorisága Gyakrabban Ritkábban (általában a 2. generációval)
Fragmentáció kockázata Alacsony (összepréselhető) Magas