Питання 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

Шляхи просування

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 і як його налаштувати? — Поріг запуску конкурентної розмітки у 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]]