Gymterview
senior

Что такое 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).