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
- 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.
- 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.
- 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ú.
- 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é |