Sobes.tech
Middle+

За какво е необходим разделянето на големите обекти (Large Object Heap) и малките обекти (Small Object Heap) в .NET?

sobes.tech AI

Отговор от AI

Разделянето на купчини LOH и SOH оптимизира управлението на паметта за обекти с различен размер.

Small Object Heap (SOH)

  • Съхранява обекти с размер до 85 KB.
  • Използва генерационен събирач на отпадъци (Generational Garbage Collection - GC).
  • Наскоро създадените обекти са в поколение 0. Оцелелите обекти се преместват в поколение 1, след това в поколение 2.
  • Събирането на отпадъци е по-често и по-ефективно за малки обекти.
// Пример за създаване на обект на SOH
string smallString = "Това е малък низ"; // По-малко от 85 KB
object smallObject = new object(); // Малък обект

Large Object Heap (LOH)

  • Съхранява обекти с размер 85 KB и повече.
  • Не е генерационен като SOH. Обикновено се почиства само при пълно събиране на отпадъци (поколение 2).
  • Алокацията на памет на LOH може да е по-бавна поради търсенето на непрекъснат блок памет.
  • Фрагментацията на LOH може да доведе до проблеми с алокацията на големи обекти, дори ако общата свободна памет е достатъчна.
  • Обектите на LOH не се преместват от GC по подразбиране (с .NET Framework 4.5.1 има възможност за компресиране на LOH, но това е изключено по подразбиране и има свои разходи). Това предотвратява скъпото копиране на големи обеми данни.
// Пример за създаване на обект на LOH
byte[] largeArray = new byte[100 * 1024]; // Размер 100 KB > 85 KB

Предимства на разделянето

  1. Оптимизация на събирането на отпадъци: Генерационният GC е много по-ефективен за малки, краткотрайни обекти на SOH. Преместването на обекти към SOH е сравнително бързо.
  2. Намаляване на фрагментацията на SOH: Преместването на големи обекти би било изключително скъпо и би довело до силна фрагментация на SOH. Разполагането им на отделна купчина LOH решава този проблем.
  3. Минимизиране на разходите: Преместването на големи обекти към LOH би довело до значителни разходи. По подразбиране GC не ги преместват, което елиминира тези разходи.
  4. Подобряване на производителността при разпределяне на памет: Разпределянето на SOH често е много бързо (чрез указател), докато на LOH може да е необходимо търсене на подходящ свободен блок. Разделянето запазва високата скорост на разпределяне за повечето (малки) обекти.
Характеристика Small Object Heap (SOH) Large Object Heap (LOH)
Размер на обекта До 85 KB 85 KB и повече
Модел GC Генерационен (поколения 0, 1, 2) Не генерационен (по подразбиране)
Преместване на обекти Да (уплътнение) Не (по подразбиране)
Честота на почистване По-често По-рядко (обикновено с поколение 2)
Риск от фрагментация Нисък (уплътнява се) Висок