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