С какими сборщиками мусора (Garbage Collector) в Java вы работали?

Ответ

В 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.

Ответ 18+ 🔞

О, сборщики мусора в Java! Ну это ж целая эпопея, блядь, как с Герасимом и Муму, только тут не собачку топят, а память освобождают, в рот меня чих-пых!

Смотри, их тут, как Толстых, дохуя развелось. Каждый со своим характером, блядь.

Вот тебе главные герои этой саги:

Сборщик Суть его, блядь Как позвать Кому подходит
Serial GC Одинокий волк, однопоточный. Работает — всё замирает, как вкопанное (STW паузы). -XX:+UseSerialGC Для мелких десктопных поделок, где куча — с напёрсток. Проще говоря, для учебных проектов, чтобы не париться.
Parallel GC (Throughput) Командный игрок, многопоточный. Его девиз: "Главное — успеть впердолить!" Оптимизирован, чтобы перемолоть как можно больше мусора за раз. -XX:+UseParallelGC Для фоновых задач, где важна общая скорость, а не мелкие подёргивания. Типа, "пережёвывай данные, а на паузы всем похуй".
CMS (Concurrent Mark-Sweep) Упокоился, блядь! Выкинь его из головы. Был такой хитрожопый, пытался работать параллельно с программой, чтоб паузы меньше были. Но загнулся, накрылся медным тазом, ещё с Java 14 его нет. -XX:+UseConcMarkSweepGC Исторический артефакт. Для ностальгии по старым временам, когда задержки боялись.
G1 (Garbage-First) Нынешний царь-батюшка, по умолчанию с Java 9. Балансир, сука. Пытается и пропускную способность не потерять, и паузы подстричь. Кучу на регионы порезал, умный такой. -XX:+UseG1GC Универсальный солдат. Для 99% серверных приложений — то, что надо. Нормальный пацан.
ZGC Аристократ, низколатентный красавчик. Клянётся, что паузы у него не больше 10 мс, даже если память — овердохуища терабайтов. -XX:+UseZGC Для систем, где каждая миллисекунда на счету. Финансы, реаль-тайм штуки. Но живёт пока только на Linux/macOS, пидарас шерстяной.
Shenandoah Брат-близнец ZGC, но из другой семьи. Тоже низкие задержки обещает, но алгоритмы другие и на больше систем завезён. -XX:+UseShenandoahGC Почти как ZGC, но если твоя ОС — не из списка разрешённых для того красавчика.

Ну и как этим хозяйством управлять? Вот, смотри, примеры, чтоб не быть распиздяем:

# Запускаем с G1 и говорим ему: "Мужик, старайся, чтобы паузы были не больше 200 мс, а то некрасиво!"
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar my-application.jar

# А тут включаем магию ZGC для супер-пупер отзывчивого приложения (Java 11+)
java -XX:+UseZGC -Xmx4g -jar my-low-latency-app.jar

Итог, Колян: Выбор — это всегда компромисс, блядь. Либо ты жрёшь данные как не в себя (Throughput), либо откликаешься быстрее, чем мартышлюшка (Low Latency). Для большинства — G1, и не еби мозг. Если же у тебя приложение про "волнение ебать, терпения ноль ебать" из-за задержек — тогда уже смотри в сторону ZGC или Shenandoah. Вот и вся философия, ёпта!