Что такое Young Generation?
4. Eden очищается
🟢 Junior Level
Young Generation — область Heap, куда попадают все новые объекты.
Зачем отдельный Young Gen: ~90-98% объектов умирают быстро. Копирующий сборщик эффективен для этого паттерна: копируем только живые объекты (2%), мёртвые просто игнорируем.
Простая аналогия: “Детский сад” для объектов. Большинство объектов “умирают” здесь очень быстро.
Структура:
- Eden — сюда создаются новые объекты
- Survivor 0 и Survivor 1 — сюда попадают выжившие после GC
Minor GC (сборка молодого поколения):
- Eden заполнился → запускается GC
- Мёртвые объекты удаляются
- Живые копируются в Survivor
- 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
- TLAB — аллокация почти бесплатна
- Избегайте Premature Promotion
- G1 Humongous → увеличьте G1HeapRegionSize
- Для G1: не фиксируйте
-Xmn— G1 сам адаптивно меняет размер Young Gen. Для Serial/Parallel GC фиксация-Xmnможет быть полезна. - Мониторьте 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 существуют]]