Middle+
Proč je v .NETu potřeba rozdělení na Heap velkých objektů (Large Object Heap) a Heap malých objektů (Small Object Heap)?
sobes.tech AI
Odpověď od AI
Rozdělení haleb LOH a SOH optimalizuje správu paměti pro objekty různých velikostí.
Small Object Heap (SOH)
- Uchovává objekty do velikosti 85 KB.
- Používá generační sběrač odpadu (Generational Garbage Collection - GC).
- Nedávno vytvořené objekty jsou v generaci 0. Přežijící objekty se přesouvají do generace 1, poté do generace 2.
- Sběr odpadu je častější a efektivnější pro malé objekty.
// Příklad vytvoření objektu na SOH
string smallString = "Toto je malý řetězec"; // Menší než 85 KB
object smallObject = new object(); // Malý objekt
Large Object Heap (LOH)
- Uchovává objekty velikosti 85 KB a více.
- Není generační jako SOH. Obvykle se čistí pouze při úplném sběru odpadu (generace 2).
- Alokace paměti na LOH může být pomalejší kvůli hledání souvislého bloku paměti.
- Fragmentace LOH může způsobit problémy s alokací velkých objektů, i když je celkově dostatek volné paměti.
- Objekty na LOH nejsou výchozí GC přesouvány (s .NET Framework 4.5.1 je možné snižovat LOH, ale je to vypnuto ve výchozím nastavení a má své náklady). To zabraňuje nákladnému kopírování velkých objemů dat.
// Příklad vytvoření objektu na LOH
byte[] largeArray = new byte[100 * 1024]; // Velikost 100 KB > 85 KB
Výhody oddělení
- Optimalizace sběru odpadu: Generační GC je mnohem efektivnější pro malé, krátkodobé objekty na SOH. Přesun objektů na SOH je relativně rychlý.
- Snížení fragmentace SOH: Přesun velkých objektů by byl extrémně nákladný a vedl by k silné fragmentaci SOH. Umístění těchto objektů na samostatnou haldu LOH tento problém řeší.
- Minimalizace režijních nákladů: Přesun velkých objektů na LOH by vedl k významným režijním nákladům. Výchozí GC je nepřesouvá, což tento náklad odstraňuje.
- Zlepšení výkonu alokace paměti: Alokace na SOH je často velmi rychlá (pomocí ukazatele), zatímco na LOH může být potřeba hledat vhodný volný blok. Oddělení umožňuje zachovat vysokou rychlost alokace pro většinu (malých) objektů.
| Charakteristika | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Velikost objektu | Do 85 KB | 85 KB a více |
| Model GC | Generační (představující generace 0, 1, 2) | Ne-generační (výchozí) |
| Přesun objektů | Ano (komprese) | Ne (výchozí) |
| Frekvence čištění | Častěji | Méně často (obvykle s generací 2) |
| Riziko fragmentace | Nízké (komprimuje se) | Vysoké |