На какие основные области делится Heap (куча) в JVM?

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

Ответ

Куча (Heap) в JVM разделена на области для оптимизации управления памятью и алгоритмов сборки мусора (Garbage Collection, GC). Основное деление:

  1. Young Generation (Молодое поколение)

    • Назначение: Здесь размещаются новосозданные объекты. Большинство объектов умирают молодыми.
    • Структура: Состоит из одной области Eden и двух меньших Survivor Spaces (S0 и S1, иногда называемых From и To).
    • Процесс (Minor GC): Новые объекты создаются в Eden. После заполнения Eden запускается Minor GC. Выжившие объекты перемещаются в один из Survivor Spaces. Объекты, пережившие несколько циклов в Young Generation, промоутируются (promoted) в Old Generation.
  2. Old Generation (Tenured Generation, Старое поколение)

    • Назначение: Содержит долгоживущие объекты, которые пережили несколько сборок в Young Generation.
    • Процесс (Major/Full GC): Сборка мусора здесь происходит реже, но является более затратной операцией.
  3. 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.