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

Что такое Young Generation?

4. Eden очищается

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

🟢 Junior Level

Young Generation — область Heap, куда попадают все новые объекты.

Зачем отдельный Young Gen: ~90-98% объектов умирают быстро. Копирующий сборщик эффективен для этого паттерна: копируем только живые объекты (2%), мёртвые просто игнорируем.

Простая аналогия: “Детский сад” для объектов. Большинство объектов “умирают” здесь очень быстро.

Структура:

  • Eden — сюда создаются новые объекты
  • Survivor 0 и Survivor 1 — сюда попадают выжившие после GC

Minor GC (сборка молодого поколения):

  1. Eden заполнился → запускается GC
  2. Мёртвые объекты удаляются
  3. Живые копируются в Survivor
  4. Eden очищается

Почему быстро: 98% объектов мёртвы → копируются только 2%


🟡 Middle Level

Аллокация: TLAB

Каждому потоку → свой TLAB в Eden
  TLAB = 64 КБ эксклюзивной памяти
  
Аллокация:
  pointer += object_size  // Bump-the-pointer
  → Быстрее чем malloc() в C++!

Жизненный цикл

new Object() → Eden
  ↓ Minor GC
Survivor (age +1)
  ↓ Minor GC (age +1)
Survivor (age +2)
  ↓ ... (до age = 15)
Old Generation

Premature Promotion

Проблема: Survivor переполнен
  → Объекты выталкиваются в Old Gen
  → Old Gen забивается мусором
  → Full GC!

Решение: увеличить SurvivorRatio или Young Gen

Тюнинг

-Xmn2g                     # Фиксированный Young Gen
-XX:SurvivorRatio=8        # Eden:Survivor = 8:1
-XX:MaxTenuringThreshold=15  # Возраст перед Old Gen

🔴 Senior Level

PLAB (Promotion Local Allocation Buffer)

При Minor GC: выжившие копируются в Survivor/Old
  → PLAB = TLAB для копирования
  → Каждый GC поток имеет свой PLAB
  → Избегает contention при эвакуации

PLAB (Promotion Local Allocation Buffer) — аналог TLAB для Old Gen.
Поток копирует объекты из Survivor в Old Gen через свой приватный буфер,
без синхронизации.

G1 Humongous Regions

Объект > 50% региона → Humongous
  → Сразу в Old Gen (не в Eden!)
  → Не копируется в Minor GC
  → Экономит ресурсы на бесполезное копирование

Humongous Regions — регионы G1 для объектов > 50% размера региона.
Аллоцируются напрямую в Old Gen.

PrintTenuringDistribution

-XX:+PrintTenuringDistribution

# Вывод:
 Desired survivor size: 10 MB
 Age 1: 5000 objects, 40000 bytes
 Age 2: 2000 objects, 16000 bytes
 ...
 Age 15: 100 objects, 800 bytes

→ Помогает настроить MaxTenuringThreshold

Best Practices

  1. TLAB — аллокация почти бесплатна
  2. Избегайте Premature Promotion
  3. G1 Humongous → увеличьте G1HeapRegionSize
  4. Для G1: не фиксируйте -Xmn — G1 сам адаптивно меняет размер Young Gen. Для Serial/Parallel GC фиксация -Xmn может быть полезна.
  5. Мониторьте tenuring distribution

Резюме для Senior

  • Young Gen = copying collector, O(живые объекты)
  • TLAB/PLAB = lock-free аллокация/эвакуация
  • Premature Promotion = главный враг производительности
  • Humongous Objects = сразу в Old Gen
  • G1 адаптивно меняет размер Young Gen

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

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

  • Young Gen = Eden (80%) + Survivor S0 (10%) + Survivor S1 (10%)
  • Все новые объекты создаются в Eden; Minor GC копирует живые в Survivor, Eden очищается
  • TLAB (Thread Local Allocation Buffer) — приватный буфер потока в Eden, аллокация = pointer bumping (0 синхронизации)
  • PLAB (Promotion Local Allocation Buffer) — аналог TLAB для Old Gen при эвакуации выживших объектов
  • MaxTenuringThreshold = 15 (по умолчанию); объект попадает в Old Gen после 15 сборок
  • Premature Promotion: Survivor переполнен → объекты выталкиваются в Old Gen → Full GC
  • Humongous Objects (G1): объект > 50% региона → сразу в Old Gen, не копируется в Minor GC

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

  • Почему Minor GC такой быстрый? — 98% объектов в Eden мёртвы; копируются только 2% живых (O(живые), не O(всё))
  • Что делает -XX:+PrintTenuringDistribution? — Показывает распределение объектов по age; помогает настроить MaxTenuringThreshold
  • Почему не стоит фиксировать -Xmn для G1? — G1 адаптивно меняет размер Young Gen для достижения MaxGCPauseMillis; фиксация ломает адаптивность
  • Что такое SurvivorRatio? — Отношение Eden:Survivor (по умолчанию 8:1);太小 → Premature Promotion

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

  • «Все объекты живут долго, Young Gen бесполезен» — Weak Generational Hypothesis верна для большинства приложений
  • «Фиксирую -Xmn для G1, чтобы контролировать память» — G1 теряет адаптивность, паузы становятся непредсказуемыми
  • «Minor GC сканирует Old Gen» — Card Table оптимизация: сканируются только Dirty карточки

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

  • [[8. Что такое поколения в GC (young, old, metaspace)]]
  • [[10. Что такое Old Generation (Tenured)]]
  • [[13. Что такое G1 GC]]
  • [[2. Что хранится в Heap]]
  • [[12. Какие алгоритмы GC существуют]]