Разделение куч LOH и SOH в .NET оптимизирует управление памятью для объектов разного размера.
Small Object Heap (SOH)
- Хранит объекты размером до 85 КБ.
- Использует генерационный сборщик мусора (Generational Garbage Collection - GC).
- Объекты, созданные недавно, попадают в поколение 0. Выжившие объекты перемещаются в поколение 1, затем в поколение 2.
- Сборка мусора происходит чаще и эффективнее для небольших объектов.
csharp
Large Object Heap (LOH)
- Хранит объекты размером 85 КБ и более.
- Не является генерационным в том же смысле, что SOH. Обычно очищается только при полной сборке мусора (поколение 2).
- Выделение памяти на LOH может быть медленнее из-за поиска непрерывного блока памяти.
- Фрагментация LOH может привести к проблемам с выделением больших объектов, даже если суммарно свободной памяти достаточно.
- Объекты на LOH не перемещаются GC по умолчанию (с .NET Framework 4.5.1 появилась возможность сжимать LOH, но это отключено по умолчанию и имеет свои затраты). Это предотвращает дорогостоящее копирование больших объемов данных.
csharp
Преимущества разделения
- Оптимизация сборки мусора: Генерационный GC на SOH горазд