Как выбрать сборщик мусора: Parallel, G1 или ZGC?
- Сервис с кучей 16 ГБ должен держать задержку в десятках миллисекунд. Какой сборщик выбрать?
- Сервис с кучей в 16 ГБ должен держать задержку ответа в пределах десятков миллисекунд. Какой сборщик выберешь и почему?
Ось выбора — пропускная способность против задержки. Parallel — максимум throughput, паузы растут с кучей: батчи. G1 (по умолчанию с JDK 9) — баланс с целевой паузой MaxGCPauseMillis. ZGC (или Shenandoah) — паузы под миллисекунду почти независимо от размера кучи ценой CPU.
- 16 ГБ и SLA в десятки мс — ZGC; на JDK 21+ поколенческий
- Маленькая куча и 1–2 CPU — JVM сама выберет Serial
- Выбор подтверждают нагрузочным тестом по перцентилям пауз, а не среднему
А ещё Сборщик не лечит высокий темп аллокаций и утечки
Подробно
| Parallel | G1 | ZGC | |
|---|---|---|---|
| цель | throughput | баланс | минимальные паузы |
| паузы | сотни мс — секунды, растут с кучей | десятки — сотни мс, цель задаётся | < 1 мс |
| плата | длинные паузы | средняя | ~10–15% CPU, больше памяти |
| где | батчи, аналитика | большинство сервисов | low-latency, большие кучи |
Parallel собирает всё в паузе, но многими потоками — максимальная доля времени на полезную работу.
G1 делит кучу на регионы, собирает в первую очередь самые «мусорные» (отсюда Garbage First) и подбирает объём работы под цель -XX:MaxGCPauseMillis (по умолчанию 200 мс). Маркировка старого поколения конкурентная, эвакуация — в паузе.
ZGC выполняет и маркировку, и перемещение конкурентно, опираясь на барьеры чтения и цветные указатели. Остановки — только короткие служебные этапы. С JDK 21 есть поколенческий режим (с JDK 23 — по умолчанию), который заметно снижает накладные расходы. Shenandoah — похожий подход от Red Hat.
Порядок решения: сформулировать SLA (p99 паузы), измерить на текущем сборщике, попробовать альтернативу под той же нагрузкой, сравнить и паузы, и потребление CPU.
Что хотят услышать
- Компромисс throughput и latency.
- Свойства каждого сборщика.
- Выбор под конкретный SLA и подтверждение измерениями.
Частые ошибки
- «ZGC всегда лучше» — без учёта цены по CPU.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Serial — для продакшена, остальные только для тестов
- ✓Parallel — throughput, G1 — баланс с предсказуемыми паузами, ZGC — минимальные паузы
- ✗ZGC всегда лучше: он одновременно даёт максимальный throughput и минимальные паузы на любой куче
- ✗CMS — современный дефолт для низколатентных сервисов
Что спросят дальше
- Что значит garbage-first в G1?
- За счёт чего ZGC держит паузы суб-мс?
- Что такое safepoint и почему пауза может затянуться из-за него?
- В каком случае Parallel окажется лучшим выбором?
Разбор темы
- GC: алгоритмы и сборщики
Mark-sweep-compact и копирование, stop-the-world и safepoints, конкурентная маркировка, G1 и ZGC и выбор по throughput/latency.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.