Sobes.tech
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í

  1. 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ý.
  2. 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ší.
  3. 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.
  4. 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é