Вопрос 10 · Раздел 3

Что такое Old Generation (Tenured)?

IHOP (Initiating Heap Occupancy Percent) — порог в G1, при котором начинается Mixed GC. По умолчанию 45%: когда Old Gen заполнен на 45%, G1 начинает фоновую сборку.

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Old Generation — область Heap для объектов, переживших несколько сборок Young Generation. JVM считает их «стабильными» и собирает реже.

Простая аналогия: “Склад” для вещей, которые вы храните годами.

Как объекты попадают сюда:

  • Пережили 15 сборок молодого поколения
  • Слишком большие для Young Generation

Full GC — в G1 и Parallel GC чистит весь Heap → долгая пауза (секунды). В ZGC/Shenandoah Full GC практически отсутствует.


🟡 Middle Level

Алгоритмы очистки

Алгоритм Плюсы Минусы
Mark-Sweep Быстро, конкурентно Фрагментация
Mark-Compact Без фрагментации Долгий STW

Promotion пути

1. Tenuring: объект достиг MaxTenuringThreshold (15)
2. Survivor Overflow: Survivor переполнен
3. Humongous Objects: объект > 50% региона G1

Promotion Failure

Minor GC пытается продвинуть объект в Old
  → Old Gen заполнен или фрагментирован
  → Full GC (STW на весь Heap!)
  
Решение: увеличить Old Gen или уменьшить Promotion Rate

Тюнинг

-XX:NewRatio=2                    # Old:Young = 2:1
-XX:InitiatingHeapOccupancyPercent=45  # G1: порог Old GC (IHOP)

IHOP (Initiating Heap Occupancy Percent) — порог в G1, при котором начинается Mixed GC. По умолчанию 45%: когда Old Gen заполнен на 45%, G1 начинает фоновую сборку.


🔴 Senior Level

Free Lists

Без уплотнения (G1, CMS):
  → GC ведёт Free Lists — списки свободных блоков
  → Аллокация = поиск подходящего блока
  → Медленнее, чем Pointer Bumping

Floating Garbage

Объекты, умершие ПОСЛЕ разметки, но ДО завершения цикла
  → Занимают место до следующей сборки
  → Неизбежный overhead конкурентных GC

Floating Garbage — объекты, которые стали недостижимы AFTER того,
как GC сделал snapshot. Они не будут собраны в этом цикле,
но будут собраны в следующем.

G1 Mixed GC

G1 не чистит весь Old Gen сразу!
  → Выбирает самые "грязные" регионы
  → Очищает их вместе с Young Gen
  → Укладывается в MaxGCPauseMillis

ZGC и Shenandoah

Конкурентное уплотнение:
  → Объекты перемещаются БЕЗ STW
  → Паузы < 1 мс
  → Цена: CPU overhead (Load Barriers)

Best Practices

  1. Избегайте Premature Promotion
  2. Мониторьте Old Gen fill rate
  3. IHOP настройте для G1
  4. ZGC для < 1 мс пауз
  5. Не увеличивайте Old Gen без анализа

Резюме для Senior

  • Old Gen = долгоживущие объекты, дорогие сборки
  • Mark-Sweep vs Mark-Compact — trade-off
  • Promotion Failure = катастрофа для latency
  • G1 Mixed GC = постепенная очистка
  • ZGC/Shenandoah = конкурентное уплотнение

🎯 Шпаргалка для интервью

Обязательно знать:

  • Old Gen хранит объекты, пережившие 15 сборок (MaxTenuringThreshold), слишком большие объекты, и при переполнении Survivor
  • Full GC чистит весь Heap → долгая пауза (секунды); в ZGC/Shenandoah Full GC практически отсутствует
  • Два алгоритма: Mark-Sweep (быстро, но фрагментация) vs Mark-Compact (без фрагментации, но долгий STW)
  • IHOP (InitiatingHeapOccupancyPercent) — порог в G1 (по умолчанию 45%); когда Old Gen заполнен на 45%, G1 начинает фоновую Mixed GC
  • Promotion Failure: Minor GC не может продвинуть объект в Old → Full GC (STW на весь Heap)
  • G1 Mixed GC: не чистит весь Old Gen, выбирает самые «грязные» регионы, укладывается в MaxGCPauseMillis
  • Floating Garbage: объекты, ставшие недостижимыми ПОСЛЕ разметки; будут собраны в следующем цикле

Частые уточняющие вопросы:

  • Что такое IHOP и как его настроить? — Porog запуска конкурентной разметки в G1; если Promotion Rate высокий, увеличьте (чтобы GC успел); если низкий — уменьшите
  • Почему G1 Mixed GC лучше Full GC? — G1 чистит Old Gen постепенно, регионы за регионом; Full GC = STW всего Heap
  • Что такое Free Lists? — Списки свободных блоков при отсутствии уплотнения; аллокация = поиск подходящего блока (медленнее pointer bumping)
  • Когда ZGC лучше G1 для Old Gen? — Когда SLA < 10 мс; ZGC делает конкурентное уплотнение без STW

Красные флаги (НЕ говорить):

  • «Увеличу Old Gen и проблема решится» — без анализа Promotion Rate это маскирует проблему
  • «Full GC — это нормально для production» — Full GC = секунды паузы; для SLA < 100 мс это неприемлемо
  • «Mark-Sweep лучше Mark-Compact» — Mark-Sweep вызывает фрагментацию, что ведёт к Promotion Failure

Связанные темы:

  • [[8. Что такое поколения в GC (young, old, metaspace)]]
  • [[9. Что такое Young Generation]]
  • [[13. Что такое G1 GC]]
  • [[14. Что такое ZGC]]
  • [[16. Что такое stop-the-world]]