Middle+
Do czego służy rozdzielenie dużych obiektów (Large Object Heap) i małych obiektów (Small Object Heap) w .NET?
sobes.tech AI
Odpowiedź od AI
Podział stosu LOH i SOH w .NET optymalizuje zarządzanie pamięcią dla obiektów różnej wielkości.
Small Object Heap (SOH)
- Przechowuje obiekty do 85 KB.
- Używa generacyjnego zbieracza śmieci (Generational Garbage Collection - GC).
- Nowo utworzone obiekty trafiają do pokolenia 0. Obiekty, które przetrwają, są przenoszone do pokolenia 1, a następnie do pokolenia 2.
- Zbiór śmieci odbywa się częściej i jest bardziej wydajny dla małych obiektów.
// Przykład tworzenia obiektu na SOH
string smallString = "To jest mały ciąg znaków"; // Mniej niż 85 KB
object smallObject = new object(); // Mały obiekt
Large Object Heap (LOH)
- Przechowuje obiekty o rozmiarze 85 KB i więcej.
- Nie jest generacyjny w tym samym sensie co SOH. Zazwyczaj jest czyszczony tylko podczas pełnego zbierania śmieci (pokolenie 2).
- Przydział pamięci na LOH może być wolniejszy z powodu wyszukiwania ciągłego bloku pamięci.
- Fragmentacja LOH może powodować problemy z przydziałem dużych obiektów, nawet jeśli łącznie dostępna pamięć jest wystarczająca.
- Obiekty na LOH nie są domyślnie przenoszone przez GC (w .NET Framework 4.5.1 wprowadzono możliwość kompresji LOH, ale jest wyłączona domyślnie i wiąże się z kosztami). Zapobiega to kosztownym kopiowaniu dużych ilości danych.
// Przykład tworzenia obiektu na LOH
byte[] largeArray = new byte[100 * 1024]; // Rozmiar 100 KB > 85 KB
Zalety rozdzielenia
- Optymalizacja zbierania śmieci: Generacyjny GC na SOH jest znacznie bardziej wydajny dla małych, krótkotrwałych obiektów. Przenoszenie obiektów na SOH jest stosunkowo szybkie.
- Zmniejszenie fragmentacji SOH: Przenoszenie dużych obiektów byłoby bardzo kosztowne i prowadziłoby do silnej fragmentacji SOH. Umieszczenie ich na osobnym stosie LOH rozwiązuje ten problem.
- Minimalizacja kosztów dodatkowych: Przenoszenie dużych obiektów na LOH wiązałoby się z dużymi kosztami. Brak migracji przez GC (domyślnie) tego unika.
- Poprawa wydajności alokacji pamięci: Alokacja na SOH jest często bardzo szybka (za pomocą wskaźników), podczas gdy na LOH może wymagać wyszukiwania odpowiedniego wolnego bloku. Rozdzielenie pozwala utrzymać wysoką szybkość alokacji dla większości (małych) obiektów.
| Charakterystyka | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Rozmiar obiektu | Do 85 KB | 85 KB i więcej |
| Model GC | Generacyjny (pokolenia 0, 1, 2) | Nie generacyjny (domyślnie) |
| Przenoszenie obiektów | Tak (konsolidacja) | Nie (domyślnie) |
| Częstotliwość czyszczenia | Częściej | Rzadziej (zwykle z pokoleniem 2) |
| Ryzyko fragmentacji | Niskie (jest konsolidowany) | Wysokie |