Sobes.tech
Middle+

Na čo je potrebné rozdelenie veľkých objektov (Large Object Heap) a malých objektov (Small Object Heap) v .NET?

sobes.tech AI

Odpoveď od AI

Rozdelenie LOH a SOH na haldy optimalizuje správu pamäte pre objektov rôznych veľkostí.

Small Object Heap (SOH)

  • Uloží objekty do veľkosti 85 KB.
  • Používa generačný zberač odpadu (Generational Garbage Collection - GC).
  • Nedávno vytvorené objekty sú v generácii 0. Prežívajúce objekty sa presúvajú do generácie 1, potom do generácie 2.
  • Zber odpadu je častejší a efektívnejší pre malé objekty.
// Príklad vytvorenia objektu na SOH
string smallString = "Toto je malý reťazec"; // Menej ako 85 KB
object smallObject = new object(); // Malý objekt

Large Object Heap (LOH)

  • Uloží objekty veľkosti 85 KB a viac.
  • Nie je generacioný ako SOH. Zvyčajne sa čistí iba pri úplnom zbere odpadu (generácia 2).
  • Alokácia pamäte na LOH môže byť pomalšia kvôli hľadaniu súvislého bloku pamäte.
  • Fragmentácia LOH môže spôsobiť problémy s alokáciou veľkých objektov, aj keď je celkový voľný priestor dostatočný.
  • Objekty na LOH nie sú predvolene presúvané GC (s .NET Framework 4.5.1 je možné znižovať LOH, ale je to vypnuté vo výchozom nastavení a má svoje náklady). To zabraňuje nákladnému kopírovaniu veľkých objemov dát.
// Príklad vytvorenia objektu na LOH
byte[] largeArray = new byte[100 * 1024]; // Veľkosť 100 KB > 85 KB

Výhody oddelenia

  1. Optimalizácia zberu odpadu: Generačný GC je oveľa efektívnejší pre malé, krátkodobé objekty na SOH. Presun objektov na SOH je relatívne rýchly.
  2. Zníženie fragmentácie SOH: Presun veľkých objektov by bol mimoriadne nákladný a viedol by k silnej fragmentácii SOH. Umiestnenie týchto objektov na samostatnú haldu LOH rieši tento problém.
  3. Minimalizácia nákladov: Presun veľkých objektov na LOH by viedol k významným nákladom. Predvolený GC ich nepresúva, čím sa tieto náklady eliminujú.
  4. Zlepšenie výkonu alokácie pamäte: Alokácia na SOH je často veľmi rýchla (pomocou ukazovateľa), zatiaľ čo na LOH môže byť potrebné hľadanie vhodného voľného bloku. Oddelenie umožňuje zachovať vysokú rýchlosť alokácie pre väčšinu (malých) objektov.
Charakteristika Small Object Heap (SOH) Large Object Heap (LOH)
Veľkosť objektu Do 85 KB 85 KB a viac
GC model Generačný (pokoljenja 0, 1, 2) Není generacioní (podľa predvolieb)
Presun objektov Áno (kompresia) Nie (podľa predvolieb)
Frekvencia čistenia Častejšie Menej často (zvyčajne s generáciou 2)
Riziko fragmentácie Nízke (komprimuje sa) Vysoké