В C# .NET используется несколько видов куч, обеспечивающих эффективное управление памятью и выполнение кода. Основные из них:
Куча управляемой памяти (Managed Heap)
В .NET существует автоматическое управление памятью через сборщик мусора (GC), который работает с управляемой кучей. Вся память для объектов в управляемом коде выделяется в этой куче. Она разделена на три поколения:
- Поколение 0 – для короткоживущих объектов, часто освобождаемых при первом проходе сборщика мусора.
- Поколение 1 – промежуточное поколение, в которое продвигаются объекты, пережившие хотя бы один цикл сборки мусора.
- Поколение 2 – для долгоживущих объектов, таких как статические данные и крупные объекты.
Куча больших объектов (Large Object Heap, LOH)
Используется для хранения крупных объектов размером более 85 000 байт. Память в LOH не перемещается во время работы сборщика мусора, чтобы избежать накладных расходов, связанных с перемещением больших блоков данных.
Нативная куча (Native Heap)
Используется при работе с неуправляемым кодом, включая вызовы через P/Invoke, COM-объекты, работу с указателями и объектами, созданными через Marshal.AllocHGlobal
или VirtualAlloc
.
Pinned Object Heap (POH)
Введена в .NET 5 для хранения объектов, которые не должны перемещаться сборщиком мусора. Это особенно полезно при взаимодействии с нативным кодом, где указатели на объекты должны оставаться неизменными.
Каждая из куч играет важную роль в оптимизации работы приложения, обеспечивая баланс между производительностью и эффективностью использования памяти.