Sobes.tech
Middle+

Waarvoor is de scheiding tussen de Large Object Heap en de Small Object Heap in .NET nodig?

sobes.tech AI

Antwoord van AI

De scheiding van LOH en SOH in .NET optimaliseert het geheugenbeheer voor objecten van verschillende groottes.

Small Object Heap (SOH)

  • Slaat objecten op tot 85 KB.
  • Gebruikt een generational Garbage Collector (Generational Garbage Collection - GC).
  • Recent gemaakte objecten vallen in generatie 0. Overlevende objecten worden verplaatst naar generatie 1, daarna naar generatie 2.
  • Garbage collection gebeurt vaker en is efficiënter voor kleine objecten.
// Voorbeeld van het maken van een object in SOH
string smallString = "Dit is een kleine string"; // Minder dan 85 KB
object smallObject = new object(); // Klein object

Large Object Heap (LOH)

  • Slaat objecten op van 85 KB en groter.
  • Is niet generational in dezelfde zin als SOH. Wordt meestal alleen schoongemaakt tijdens een volledige garbage collection (generatie 2).
  • Toewijzing van geheugen op LOH kan trager zijn vanwege het zoeken naar een continu blok geheugen.
  • Fragmentatie van LOH kan problemen veroorzaken bij het toewijzen van grote objecten, zelfs als er in totaal voldoende vrije geheugen is.
  • Objecten op LOH worden standaard niet verplaatst door GC (met .NET Framework 4.5.1 is de optie om LOH te comprimeren geïntroduceerd, maar deze is standaard uitgeschakeld en heeft eigen kosten). Dit voorkomt kostbare kopieën van grote hoeveelheden data.
// Voorbeeld van het maken van een object op LOH
byte[] largeArray = new byte[100 * 1024]; // Grootte 100 KB > 85 KB

Voordelen van scheiding

  1. Optimalisatie van garbage collection: De generational GC op SOH is veel efficiënter voor kleine, kortlevende objecten. Het verplaatsen van objecten naar SOH is relatief snel.
  2. Vermindering van fragmentatie in SOH: Het verplaatsen van grote objecten zou zeer kostbaar zijn en leiden tot sterke fragmentatie van SOH. Het plaatsen ervan op een aparte heap, LOH, lost dit probleem op.
  3. Minimaliseren van extra kosten: Het verplaatsen van grote objecten naar LOH zou aanzienlijke kosten met zich meebrengen. Het niet migreren door GC (standaard) voorkomt dit.
  4. Verbetering van de geheugenallocatiesnelheid: Allocatie op SOH is vaak zeer snel (met pointers), terwijl op LOH mogelijk een zoekactie naar een geschikt vrij blok nodig is. Scheiding helpt om een hoge snelheid van allocatie voor de meeste (kleine) objecten te behouden.
Kenmerk Small Object Heap (SOH) Large Object Heap (LOH)
Objectgrootte Tot 85 KB 85 KB of meer
GC-model Generational (generaties 0, 1, 2) Non-generational (standaard)
Objectverplaatsing Ja (compactie) Nee (standaard)
Schoonmaakfrequentie Frequenter Minder frequent (meestal met generatie 2)
Fragmentatierisico Laag (wordt gecomprimeerd) Hoog