Что такое сборщик мусора Shenandoah в Java?

«Что такое сборщик мусора Shenandoah в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Shenandoah — это сборщик мусора с низкими паузами (low-pause), разработанный в Red Hat для OpenJDK. Его ключевая цель — сократить время остановки приложения (STW — Stop-The-World) во время фазы эвакуации (evacuation) живых объектов, делая её выполняемой конкурентно с работой приложения.

Основные характеристики:

  • Конкурентная эвакуация: Перемещение живых объектов в новые регионы памяти происходит одновременно с выполнением потоков приложения.
  • Короткие и предсказуемые паузы: Время STW не зависит от размера кучи, а лишь от количества корневых ссылок (root scanning).
  • Регионная (Region-based) организация кучи: Память делится на регионы, что позволяет эвакуировать их независимо.

Как включить:

java -XX:+UseShenandoahGC -jar myapp.jar
Сравнение с G1: Параметр G1 GC Shenandoah GC
Эвакуация Параллельная (STW) Конкурентная (основная работа без STW)
Паузы Зависят от размера региона Краткие, почти постоянные
Накладные расходы Ниже Выше (из-за механизма перенаправления ссылок — Brooks pointers)

Идеальный сценарий использования: Приложения, чувствительные к задержкам (low-latency), такие как финансовые системы, игровые серверы или сервисы реального времени, где даже короткие, но частые паузы GC недопустимы.

Ограничение: Shenandoah требует дополнительных ресурсов CPU для фоновой конкурентной работы.