Вопрос 15 · Раздел 3

Что такое Shenandoah GC?

Barrier — это проверка, вставляемая JIT при каждой операции с памятью. Load Reference Barrier: при чтении ссылки проверяет, не перемещён ли объект. Если перемещён — автоматическ...

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Shenandoah GC — сборщик мусора с ультранизкими задержками, альтернатива ZGC.

Главное: Паузы < 1 мс, как ZGC, но разработан Red Hat для OpenJDK.

Когда использовать:

  • Нужны низкие задержки
  • Используете OpenJDK/Alpine Linux
  • ZGC недоступен

🟡 Middle Level

Ключевая инновация

Конкурентное уплотнение (Evacuation):
  → Объекты перемещаются БЕЗ остановки приложения
  → В отличие от G1 (Evacuation = STW)

Load Reference Barriers

При чтении ссылки:
  → Проверить, не переехал ли объект
  → Если переехал → вернуть новый адрес

→ Дешевле, чем Brooks Pointers (старый подход)

Barrier — это проверка, вставляемая JIT при каждой операции с памятью. Load Reference Barrier: при чтении ссылки проверяет, не перемещён ли объект. Если перемещён — автоматически исправляет указатель.

Жизненный цикл

1. Init Mark (STW) — сканирование Roots
2. Concurrent Marking — фоновая разметка
3. Final Mark (STW) — финализация
4. Concurrent Evacuation — перемещение объектов
5. Update References (STW) — обновление ссылок

Shenandoah vs ZGC

Критерий Shenandoah ZGC
Разработчик Red Hat Oracle
Барьеры Load Reference Load + Colored Pointers
Поколения Есть (Java 21+) Есть (Java 21+)

Shenandoah vs ZGC: оба concurrent, но разные механизмы. ZGC использует Colored Pointers (метаданные в указателях) и Load Barriers. Shenandoah использует Load Reference Barriers — барьер при ЧТЕНИИ ссылки, который автоматически исправляет указатель если объект перемещён.


🔴 Senior Level

Degenerated GC

Evacuation Failure → Degenerated GC (STW)
  → Если не помогло → Full GC
  
Причины:
  - High Allocation Rate
  - Маленький Heap
  
Решение: увеличить -Xmx или ConcGCThreads

CPU Overhead

Load Barriers + Concurrent Threads
  → overhead 5-15% CPU
  → Фоновые потоки GC отнимают ядра

Generational Shenandoah

Java 21+: разделение на поколения
  → -50% overhead
  → Более эффективная сборка молодых объектов

Best Practices

  1. Alpine Linux (musl libc): Shenandoah стабильнее ZGC на musl. ZGC исторически имел проблемы с musl libc.
  2. Adaptive heuristics по умолчанию
  3. Увеличьте ConcGCThreads при Allocation Stall
  4. Мониторьте Degenerated GC в логах
  5. Java 21+ → тестируйте Generational mode

Резюме для Senior

  • Shenandoah = конкурентное уплотнение
  • Load Reference Barriers = проверка при чтении
  • Degenerated GC = fallback при неудаче
  • Generational (Java 21+) = -50% overhead
  • Альтернатива ZGC для OpenJDK

🎯 Шпаргалка для интервью

Обязательно знать:

  • Shenandoah: паузы < 1 мс, конкурентное уплотнение (Evacuation БЕЗ STW); разработан Red Hat для OpenJDK
  • Load Reference Barriers: при чтении ссылки проверка, не переехал ли объект; если переехал — автоматическое исправление указателя
  • Жизненный цикл: Init Mark (STW) → Concurrent Marking → Final Mark (STW) → Concurrent Evacuation → Update References (STW)
  • Degenerated GC: Evacuation Failure → STW попытка восстановления; если не помогло → Full GC
  • Generational Shenandoah (Java 21+): разделение на поколения → -50% overhead
  • Shenandoah стабильнее ZGC на Alpine Linux (musl libc); ZGC исторически имел проблемы с musl

Частые уточняющие вопросы:

  • Чем Shenandoah отличается от ZGC? — ZGC использует Colored Pointers + Load Barriers; Shenandoah использует Load Reference Barriers (проверка только при чтении ссылки, дешевле)
  • Что такое Degenerated GC? — Fallback при Evacuation Failure: STW попытка завершить сборку; если не удалось — Full GC
  • Когда выбрать Shenandoah вместо ZGC? — Alpine Linux (musl), OpenJDK без ZGC, или если Load Reference Barriers дешевле для вашего workload
  • Что такое Adaptive Heuristics? — Shenandoah автоматически настраивает параметры GC на основе поведения приложения; обычно не требует ручной настройки

Красные флаги (НЕ говорить):

  • «Shenandoah использует Colored Pointers» — это ZGC; Shenandoah использует Load Reference Barriers
  • «Shenandoah и ZGC — одно и то же» — разные механизмы: ZGC = Colored Pointers, Shenandoah = Load Reference Barriers
  • «Shenandoah не имеет поколений» — с Java 21 есть Generational Shenandoah

Связанные темы:

  • [[14. Что такое ZGC]]
  • [[12. Какие алгоритмы GC существуют]]
  • [[16. Что такое stop-the-world]]
  • [[17. Какие GC минимизируют stop-the-world паузы]]
  • [[13. Что такое G1 GC]]