Какие сборщики мусора (Garbage Collector) вы знаете в JVM?

«Какие сборщики мусора (Garbage Collector) вы знаете в JVM?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сборщики мусора (GC) в JVM управляют автоматическим освобождением памяти. Выбор GC зависит от требований к пропускной способности (throughput) и задержкам (latency).

Основные сборщики:

Сборщик Ключевая характеристика Флаг JVM Сценарий использования
Serial GC Однопоточный, Stop-The-World паузы. -XX:+UseSerialGC Клиентские приложения с малой кучей.
Parallel GC (Throughput) Многопоточный, оптимизирован для пропускной способности. -XX:+UseParallelGC Фоновые задачи, где важна общая производительность, а не паузы.
CMS (Concurrent Mark Sweep) Старался минимизировать паузы, работая параллельно с приложением. Устарел и удален в новых JDK. -XX:+UseConcMarkSweepGC (до JDK 9/14) Устаревшие приложения, чувствительные к паузам.
G1 (Garbage-First) Поколенный, региональный сборщик, балансирующий между пропускной способностью и паузами. GC по умолчанию с JDK 9+. -XX:+UseG1GC Универсальный выбор для большинства серверных приложений.
ZGC (Z Garbage Collector) Низколатентный, паузы обычно < 10 мс, масштабируется на терабайтные кучи. -XX:+UseZGC Приложения, критичные к задержкам (финансовые транзакции, real-time системы).
Shenandoah Низколатентный, как ZGC, но с другим алгоритмом. Основная работа по сборке мусора выполняется конкурентно с приложением. -XX:+UseShenandoahGC Аналогично ZGC, часто в OpenJDK-дистрибутивах (Red Hat).

Пример настройки G1 для баланса производительности и пауз:

java -XX:+UseG1GC -Xmx4g -Xms4g -XX:MaxGCPauseMillis=200 -jar myapp.jar
  • -XX:+UseG1GC — включает G1.
  • -Xmx4g -Xms4g — задает начальный и максимальный размер кучи.
  • -XX:MaxGCPauseMillis=200 — целевое время паузы (миллисекунды).