Sobes.tech
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

  1. 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.
  2. 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.
  3. 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.
  4. 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