Зачем объекты перемещаются между областями памяти (Eden, Survivor, Old Gen) в куче JVM?

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

Ответ

Разделение кучи на области (Eden, Survivor 0/1, Old Generation) и перемещение между ними — основа работы сборщиков мусора поколений (Generational GC). Цель — оптимизация производительности сборки мусора.

Принцип слабого поколения (Weak Generational Hypothesis):

  • Большинство объектов становятся мусором очень быстро (временные объекты).
  • Немногие объекты живут долго.

Процесс перемещения и его цели:

  1. Создание в Eden: Новые объекты размещаются в Eden (самой быстрой области для аллокации).
  2. Minor GC и Survivor: При заполнении Eden запускается Minor GC. Выжившие объекты перемещаются в один из Survivor-пространств (S0 или S1). Это копирующий алгоритм, который быстро очищает Eden и дефрагментирует память.
  3. Перемещение между Survivor: При следующих Minor GC живые объекты копируются между S0 и S1. Каждое такое копирование увеличивает счётчик возраста объекта.
  4. Promotion в Old Gen: Когда возраст объекта превышает порог (по умолчанию 15), он перемещается в Old Generation. Это долгоживущие объекты (например, кэши, статические данные).
  5. Major GC (Full GC): Сборка мусора в Old Gen происходит реже, но она медленнее и обычно вызывает паузы (STW — Stop-The-World).

Зачем это нужно (преимущества):

  • Скорость: Minor GC работает очень быстро, так как сканирует только небольшую область Young Gen.
  • Эффективность памяти: Копирующий сборщик в Young Gen компактизирует память, устраняя фрагментацию.
  • Изоляция: Долгоживущие объекты изолированы в Old Gen и не сканируются при каждом Minor GC.