Что такое ZGC и Shenandoah
ZGC и Shenandoah — это сборщики мусора нового поколения, обеспечивающие сверхнизкие паузы (менее 1 мс) на heap любого размера за счёт конкурентного уплотнения памяти.
ZGC (Z Garbage Collector)
ZGC разработан Oracle, доступен с Java 11 (экспериментально), production-ready с Java 15 (JEP 377).
Ключевые характеристики:
- Паузы < 1 мс, не зависят от размера heap
- Поддержка heap до 16 TB
- Concurrent compaction — уплотнение памяти без остановки приложения
- Colored pointers — метаданные хранятся в неиспользуемых битах 64-битного указателя
- Load barriers — специальный код, выполняемый при чтении ссылки на объект
Пример
63 42 41 0
+--------+---------+
|metadata | address |
+--------+---------+
Marked0, Marked1, Remapped, Finalizable — служебные биты
Generational ZGC (Java 21+, JEP 439) — версия ZGC с поддержкой поколений. Молодые объекты собираются чаще и быстрее:
Пример
# Java 21-22: явное включение Generational ZGC
-XX:+UseZGC -XX:+ZGenerational
# Java 23+: Generational ZGC по умолчанию при -XX:+UseZGC
-XX:+UseZGC
Shenandoah
Shenandoah разработан Red Hat, доступен в OpenJDK с Java 12 (экспериментально), production-ready с Java 15.
Ключевые характеристики:
- Паузы < 1 мс, не зависят от размера heap
- Concurrent compaction
- Brooks pointers (forwarding pointers) — дополнительный указатель в заголовке каждого объекта
- Не требует цветных указателей
Сравнение ZGC и Shenandoah
| Характеристика | ZGC | Shenandoah |
|---|---|---|
| Разработчик | Oracle | Red Hat |
| Механизм forwarding | Colored pointers | Brooks pointers |
| Барьеры | Load barriers | Load + store barriers |
| Overhead на объект | Нет (информация в указателе) | +1 слово в заголовке |
| Максимальный heap | 16 TB | Ограничен ОС |
| Generational | Да (с Java 21) | В разработке |
| Доступность | Oracle JDK + OpenJDK | Только OpenJDK (не в Oracle JDK) |
Типичные сценарии
- Финансовые системы (trading, payments)
- Игровые серверы
- Real-time аналитика
- Микросервисы с жёсткими SLA
- Приложения с heap > 8 GB
Частые ошибки
- Использование ZGC/Shenandoah для batch-обработки, где важна пропускная способность — Parallel GC будет эффективнее
- Недостаточное количество CPU-ядер — concurrent GC потоки конкурируют с потоками приложения
- Использование Shenandoah на Oracle JDK — он там не доступен
- Слишком маленький heap (< 256 MB) — overhead превышает выигрыш
На собеседовании: объясните, зачем нужны ZGC/Shenandoah (паузы < 1 мс вне зависимости от heap), назовите ключевое отличие (colored pointers vs Brooks pointers) и упомяните компромисс — больше CPU в обмен на меньшую латентность. Не забудьте про Generational ZGC с Java 21. Частая ловушка — вопрос, где Shenandoah не доступен (ответ: в Oracle JDK).