Ответ
Куча (Heap) в JVM разделена на области для оптимизации управления памятью и алгоритмов сборки мусора (Garbage Collection, GC). Основное деление:
-
Young Generation (Молодое поколение)
- Назначение: Здесь размещаются новосозданные объекты. Большинство объектов умирают молодыми.
- Структура: Состоит из одной области Eden и двух меньших Survivor Spaces (S0 и S1, иногда называемых From и To).
- Процесс (Minor GC): Новые объекты создаются в Eden. После заполнения Eden запускается Minor GC. Выжившие объекты перемещаются в один из Survivor Spaces. Объекты, пережившие несколько циклов в Young Generation, промоутируются (promoted) в Old Generation.
-
Old Generation (Tenured Generation, Старое поколение)
- Назначение: Содержит долгоживущие объекты, которые пережили несколько сборок в Young Generation.
- Процесс (Major/Full GC): Сборка мусора здесь происходит реже, но является более затратной операцией.
-
Metaspace (с Java 8)
- Назначение: Хранит метаданные классов (структуры классов, методы, константные пулы).
- Важно: Metaspace не является частью Heap и располагается в нативной памяти (Native Memory). Она заменила устаревшую Permanent Generation (PermGen), которая была частью Heap до Java 7.
Визуализация жизненного цикла объекта:
// 1. Объект создается в Eden Space
Object newObj = new Object();
// 2. После Minor GC, если объект выжил, он перемещается в Survivor Space
// 3. После нескольких циклов Minor GC объект промоутируется в Old Generation
// 4. Когда Old Generation заполняется, запускается Major/Full GC
Практический совет: Разделение на поколения основано на гипотезе о слабом поколении (weak generational hypothesis) и позволяет использовать эффективные алгоритмы GC, такие как G1 или ZGC.