Що таке 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: обидва конкурентні, але різні механізми. 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]]