Ответ
В Java существует несколько реализаций сборщиков мусора (GC), каждая оптимизирована под разные сценарии.
Основные типы сборщиков мусора:
| Сборщик | Ключевая характеристика | Флаг включения | Сценарий использования |
|---|---|---|---|
| Serial GC | Однопоточный, Stop-The-World (STW) паузы. | -XX:+UseSerialGC |
Клиентские приложения с малой кучей. Простота. |
| Parallel GC (Throughput) | Многопоточный, оптимизирован для максимальной пропускной способности. | -XX:+UseParallelGC |
Фоновые задачи, где важна общая производительность, а не минимальные задержки. |
| CMS (Concurrent Mark-Sweep) | Устарел и удален (начиная с Java 14). Работал параллельно с приложением для сокращения пауз. | -XX:+UseConcMarkSweepGC |
Исторически использовался для приложений, чувствительных к задержкам. |
| G1 (Garbage-First) | Сборщик по умолчанию с Java 9. Баланс между пропускной способностью и временем пауз. Разделяет кучу на регионы. | -XX:+UseG1GC |
Универсальный выбор для большинства серверных приложений. |
| ZGC | Низколатентный, паузы не превышают 10 мс, даже на терабайтных кучах. | -XX:+UseZGC |
Приложения, критичные к задержкам (финансовые системы, Big Data). Требует Linux/macOS. |
| Shenandoah | Низколатентный, как ZGC, но с другими алгоритмами. Работает на большеем количестве ОС. | -XX:+UseShenandoahGC |
Аналогично ZGC, но с более широкой поддержкой платформ. |
Пример выбора и настройки GC:
# Запуск приложения с G1 GC и целевым временем паузы 200 мс
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar my-application.jar
# Запуск с ZGC (Java 11+)
java -XX:+UseZGC -Xmx4g -jar my-low-latency-app.jar
Выбор GC зависит от требований приложения: пропускная способность (Throughput) vs. время отклика (Latency). Для большинства современных серверных приложений G1 является хорошим выбором по умолчанию. Для систем с экстремально низкими требованиями к задержкам рассматриваются ZGC или Shenandoah.