Что такое Shenandoah GC?
Barrier — это проверка, вставляемая JIT при каждой операции с памятью. Load Reference Barrier: при чтении ссылки проверяет, не перемещён ли объект. Если перемещён — автоматическ...
🟢 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
- Alpine Linux (musl libc): Shenandoah стабильнее ZGC на musl. ZGC исторически имел проблемы с musl libc.
- Adaptive heuristics по умолчанию
- Увеличьте ConcGCThreads при Allocation Stall
- Мониторьте Degenerated GC в логах
- 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]]