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
- 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.
- 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.
- 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ő.
- 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 |