Для чего используется куча (heap) в управлении памятью?

«Для чего используется куча (heap) в управлении памятью?» — вопрос из категории Управление памятью, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Куча (heap) — это область динамически выделяемой памяти, используемая для хранения объектов с неопределённым или долгим временем жизни. В контексте C# и .NET:

  • Хранение ссылочных типов: Все экземпляры классов, массивы и другие ссылочные типы размещаются в управляемой куче.
  • Управление через Garbage Collector (GC): Память в куче автоматически освобождается сборщиком мусора, когда объекты больше не достижимы из корней приложения (например, из стека или статических полей).
  • Контраст со стеком: В отличие от стека (для небольших, короткоживущих значений и локальных переменных), куча предназначена для данных, которые должны пережить вызов метода, где они были созданы.

Пример создания объекта в куче:

// Объект 'person' создаётся в управляемой куче.
// Ссылка на него хранится в переменной в стеке (если это локальная переменная).
var person = new Person { Name = "Alice", Age = 30 };

Практические следствия:

  • Производительность: Аллокация и доступ к памяти в куче медленнее, чем в стеке.
  • Фрагментация: Длительная работа приложения может привести к фрагментации кучи, хотя GC старается это минимизировать.
  • Использование: Куча — фундаментальная часть модели памяти .NET для большинства объектов приложения.