Опишите структуру памяти JVM (Heap) для хранения объектов.

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

Ответ

Куча (Heap) JVM — это основная область для хранения всех объектов и массивов во время выполнения. Она разделена на поколения (Generations) для оптимизации работы сборщика мусора (Garbage Collector).

Структура кучи (на примере сборщика G1 или Parallel GC):

+---------------------------+
|         Heap              |
| +-----------------------+ |
| |   Young Generation    | |
| |  +-----------------+  | |
| |  |     Eden        |  | |
| |  +-----------------+  | |
| |  +-----------------+  | |
| |  |   Survivor 0    |  | |
| |  +-----------------+  | |
| |  +-----------------+  | |
| |  |   Survivor 1    |  | |
| |  +-----------------+  | |
| +-----------------------+ |
|                           |
| +-----------------------+ |
| |   Old Generation      | |
| |    (Tenured)          | |
| +-----------------------+ |
+---------------------------+

Назначение каждой области:

Область Назначение Принцип работы GC
Eden (Рай) Сюда помещаются все новые объекты при создании. Minor GC: Часто очищает Eden. Выжившие объекты перемещаются в Survivor space.
Survivor Spaces (S0, S1) Хранят объекты, пережившие одну или несколько сборок Minor GC. Объекты "пережигают" между S0 и S1. После достижения порога "возраста" объект продвигается в Old Gen.
Old Generation Хранит долгоживущие объекты, пережившие много циклов Minor GC. Major/Full GC: Происходит реже, но обычно занимает больше времени, так как сканирует всю Old Gen.

Metaspace (вне кучи, но важная область):

  • Заменила PermGen (до Java 8).
  • Хранит метаданные классов: структуры классов, байт-код, константы времени компиляции, статические переменные.
  • Память выделяется из native-памяти ОС и автоматически очищается при выгрузке классов.

Пример жизненного цикла объекта:

// 1. Объект создается в Eden.
Object shortLived = new Object();

// 2. После Minor GC, если на объект есть ссылки, он перемещается в Survivor space.
// 3. После нескольких циклов (по умолчанию 15) объект перемещается в Old Generation.
Object longLived = new Object();
// Предположим, ссылка на 'longLived' сохраняется в статическом поле.
// Объект быстро "состарится" и попадет в Old Gen.