Middle+
Wozu dient die Trennung des Large Object Heap und des Small Object Heap in .NET?
sobes.tech KI
Antwort von AI
Die Trennung von LOH und SOH im .NET optimiert die Speicherverwaltung für Objekte unterschiedlicher Größen.
Small Object Heap (SOH)
- Speichert Objekte bis zu 85 KB.
- Verwendet einen generational Garbage Collector (Generational Garbage Collection - GC).
- Kürzlich erstellte Objekte fallen in Generation 0. Überlebende Objekte werden in Generation 1 verschoben, dann in Generation 2.
- Die Müllsammlung erfolgt häufiger und ist effizienter für kleine Objekte.
// Beispiel für die Erstellung eines Objekts im SOH
string smallString = "Dies ist eine kleine Zeichenkette"; // Weniger als 85 KB
object smallObject = new object(); // Kleines Objekt
Large Object Heap (LOH)
- Speichert Objekte ab 85 KB.
- Ist nicht generational im gleichen Sinne wie der SOH. Wird normalerweise nur bei einer vollständigen Müllsammlung (Generation 2) bereinigt.
- Die Speicherzuweisung auf dem LOH kann langsamer sein, da nach einem zusammenhängenden Speicherblock gesucht wird.
- Fragmentierung des LOH kann Probleme bei der Zuweisung großer Objekte verursachen, auch wenn insgesamt genügend freier Speicher vorhanden ist.
- Objekte im LOH werden standardmäßig nicht vom GC verschoben (mit .NET Framework 4.5.1 wurde die Option eingeführt, den LOH zu komprimieren, aber dies ist standardmäßig deaktiviert und hat eigene Kosten). Dies verhindert teure Kopien großer Datenmengen.
// Beispiel für die Erstellung eines Objekts im LOH
byte[] largeArray = new byte[100 * 1024]; // Größe 100 KB > 85 KB
Vorteile der Trennung
- Optimierung der Müllsammlung: Der generational GC im SOH ist viel effizienter für kleine, kurzlebige Objekte. Das Verschieben von Objekten in den SOH ist relativ schnell.
- Reduzierung der Fragmentierung im SOH: Das Verschieben großer Objekte wäre sehr teuer und würde zu starker Fragmentierung im SOH führen. Das Platzieren in einem separaten Heap, dem LOH, löst dieses Problem.
- Minimierung zusätzlicher Kosten: Das Verschieben großer Objekte in den LOH würde erhebliche Kosten verursachen. Die Nicht-Migration durch den GC (standardmäßig) vermeidet dies.
- Verbesserung der Speicherzuweisungsgeschwindigkeit: Die Zuweisung im SOH ist oft sehr schnell (mit Zeigern), während im LOH eine Suche nach einem geeigneten freien Block erforderlich sein kann. Die Trennung hilft, eine hohe Zuweisungsgeschwindigkeit für die meisten (kleinen) Objekte aufrechtzuerhalten.
| Merkmal | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Objektgröße | Bis zu 85 KB | 85 KB und mehr |
| GC-Modell | Generational (Generationen 0, 1, 2) | Nicht-generational (standardmäßig) |
| Objektverschiebung | Ja (Kompaktierung) | Nein (standardmäßig) |
| Reinigungshäufigkeit | Häufig | Seltener (normalerweise mit Generation 2) |
| Fragmentierungsrisiko | Gering (wird kompakt) | Hoch |