Что такое Heap (куча) в контексте JVM?

«Что такое Heap (куча) в контексте JVM?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Heap (куча) — это область памяти JVM, в которой выделяется память под все объекты и массивы, создаваемые во время выполнения Java-приложения. Управление этой памятью осуществляется сборщиком мусора (Garbage Collector, GC).

Ключевые характеристики:

  • Динамическое выделение: Память под объекты выделяется во время выполнения программы оператором new.
  • Общее хранилище: Все потоки приложения используют общую кучу.
  • Управление GC: Объекты, на которые больше нет ссылок, автоматически удаляются сборщиком мусора.

Структура кучи (упрощённо):

Молодая генерация (Young Generation)
├── Eden (здесь создаются новые объекты)
└── Survivor Spaces (S0, S1) – объекты, пережившие сборку мусора

Старая генерация (Old Generation/Tenured) – долгоживущие объекты

Metaspace (ранее PermGen) – метаданные классов (не является частью кучи в классическом понимании).

Пример и последствия:

// Объект создаётся в куче
MyObject obj = new MyObject();
// Переменная 'obj' хранит ссылку на объект в куче

Практическое значение:

  1. Утечки памяти возникают, когда объекты в куче больше не нужны, но на них остаются ссылки.
  2. Настройка производительности: Параметры JVM -Xms (начальный размер) и -Xmx (максимальный размер) управляют размером кучи.
  3. OutOfMemoryError возникает, когда куча переполнена и сборщик мусора не может освободить достаточно памяти.