Ответ
Куча (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.