Ответ
JVM делит heap (кучу) на поколения (generations), основываясь на гипотезе о времени жизни объектов (weak generational hypothesis). Это позволяет оптимизировать работу сборщика мусора (Garbage Collector, GC).
Гипотеза:
- Большинство объектов умирают молодыми.
- Старые объекты редко ссылаются на молодые.
Структура heap (на примере сборщиков G1, Parallel, Serial):
| Поколение | Назначение | Типичный GC | Частота | Скорость |
|---|---|---|---|---|
| Young Generation | Создание новых объектов. | Minor GC (очень частая) | Высокая | Быстрая (копирование живых объектов) |
| ├── Eden | Здесь размещаются все новые объекты. | |||
| └── Survivor Spaces (S0, S1) | Сюда перемещаются объекты, пережившие Minor GC. | |||
| Old Generation (Tenured) | Объекты, пережившие несколько циклов в Young. | Major/Full GC (редкая) | Низкая | Медленная (mark-sweep-compact) |
| Metaspace (не heap) | Метаданные классов (заменяет PermGen). |
Пример жизненного цикла объекта:
// 1. Создание в Eden
Object obj = new Object();
// 2. Minor GC: если объект жив, он копируется в Survivor Space (S0)
// 3. Следующий Minor GC: живой объект из S0 копируется в S1 (age++)
// 4. После достижения порога возраста (например, 15) — promotion в Old Generation.
Преимущества:
- Minor GC работает только с маленькой Young Generation, поэтому он быстрый.
- Major GC затрагивает Old Generation, происходит реже, но дольше.
- Разные алгоритмы GC можно применять к разным поколениям для лучшей производительности.