Sobes.tech
Middle+

Kodėl reikalingas didelių objektų krūvos (Large Object Heap) ir mažų objektų krūvos (Small Object Heap) skirstymas .NET?

sobes.tech AI

Atsakymas iš AI

LOH ir SOH kaupimo skirstymas optimizuoja atminties valdymą skirtingo dydžio objektams.

Small Object Heap (SOH)

  • Laiko objektus iki 85 KB.
  • Naudoja generacinį šiukšlių surinkėją (Generational Garbage Collection - GC).
  • Neseniai sukurti objektai yra 0 kartos. Gyvi objektai perkeliami į 1 kartą, tada į 2 kartą.
  • Šiukšlių surinkimas dažnesnis ir efektyvesnis mažiems objektams.
// Pavyzdys, kaip sukurti objektą SOH
string smallString = "Tai mažas eilutė"; // Mažiau nei 85 KB
object smallObject = new object(); // Mažas objektas

Large Object Heap (LOH)

  • Laiko objektus, kurių dydis 85 KB ir daugiau.
  • Nėra generacinis kaip SOH. Paprastai išvalomas tik pilno šiukšlių surinkimo metu (2 kartos).
  • Atminties paskirstymas LOH gali būti lėtesnis dėl nuoseklaus atminties bloko paieškos.
  • LOH fragmentacija gali sukelti problemų su didelių objektų paskirstymu, net jei bendras laisvas atminties kiekis yra pakankamas.
  • Objektai LOH nėra numatytai perkeliami GC (su .NET Framework 4.5.1 galima sumažinti LOH, bet tai išjungta pagal numatytuosius nustatymus ir turi savo išlaidas). Tai apsaugo nuo brangaus didelių duomenų kopijavimo.
// Pavyzdys, kaip sukurti objektą LOH
byte[] largeArray = new byte[100 * 1024]; // Dydis 100 KB > 85 KB

Privalumai atskyrimo

  1. Šiukšlių surinkimo optimizavimas: Generacinis GC yra daug efektyvesnis mažiems, trumpalaikiams objektams SOH. Objektų perkėlimas į SOH yra gana greitas.
  2. SOH fragmentacijos mažinimas: Didelių objektų perkėlimas būtų labai brangus ir sukeltų stiprią fragmentaciją. Jų išdėstymas atskirame LOH sprendžia šią problemą.
  3. Išlaidų minimizavimas: Didelių objektų perkėlimas į LOH sukeltų reikšmingų išlaidų. Numatytoji GC jų neperkelia, todėl šios išlaidos yra išvengiamos.
  4. Atminties paskirstymo našumo gerinimas: Paskirstymas SOH dažnai vyksta labai greitai (naudojant rodyklę), o LOH gali reikėti ieškoti tinkamo laisvo bloko. Atskyrimas leidžia išlaikyti aukštą paskirstymo greitį daugumai (mažų) objektų.
Charakteristikos Small Object Heap (SOH) Large Object Heap (LOH)
Objekto dydis Iki 85 KB 85 KB ir daugiau
GC modelis Generacinis (0, 1, 2 kartos) Nėra generacinis (numatytas)
Objektų perkėlimas Taip (suspaudimas) Ne (numatytas)
Valymo dažnumas Dažniau Rečiau (paprastai su 2 kartos)
Fragmentacijos rizika Maža (suspaudžia) Aukšta