Короткий ответ
В HotSpot JVM исторически сменяли друг друга несколько сборщиков: Serial GC (-XX:+UseSerialGC), Parallel GC, он же Throughput Collector (-XX:+UseParallelGC), CMS (Concurrent Mark Sweep), затем G1 (-XX:+UseG1GC), ставший сборщиком по умолчанию с Java 9, и ZGC для сверхнизких пауз. Все они останавливают приложение на время сборки (stop-the-world), но современные выполняют основную работу конкурентно.
Как это работает подробнее
Serial GC — самый простой: сборка выполняется одним потоком, подходит для небольших приложений с маленькой кучей и одним-двумя ядрами. Parallel GC (Throughput Collector) — сборщик по умолчанию до Java 8: молодое и старое поколения чистит несколькими рабочими потоками, давая максимальную пропускную способность, но его паузы могут быть заметными.
CMS выполнял большую часть пометки параллельно с работающим приложением ради уменьшения пауз, но не уплотнял кучу (отсюда фрагментация) и был помечен устаревшим в JDK 9, а позже удалён.
G1 (Garbage First) делит кучу на регионы одинакового размера и собирает их инкрементально, в первую очередь регионы с наибольшим количеством мусора; он совмещает сборку молодого и старого поколений (mixed collection), уплотняет память и нацелен на предсказуемые ограниченные паузы, которые настраиваются через -XX:MaxGCPauseMillis.
- ZGC (экспериментальный с JDK 11, production с JDK 15) добивается пауз порядка миллисекунд, не зависящих от размера кучи, за счёт параллельной и конкурентной обработки ссылок.
- Для молодого поколения упоминаются сборщики DefNew (однопоточный, для Serial) и ParNew (многопоточный, применялся вместе с CMS).
Что использовать на практике
- Для маленьких приложений и простоты выбирайте Serial GC.
- Для серверных приложений с требованиями к паузам используйте G1 и настраивайте -XX:MaxGCPauseMillis.
- Для очень больших куч и сверхнизких пауз рассматривайте ZGC на JDK 15 и новее.
Подводные камни
- Не выбирайте CMS на новых JDK: он помечен устаревшим в JDK 9 и удалён в более поздних версиях.
- Паузы stop-the-world неизбежны даже у современных сборщиков, хотя они и минимизируются.
- Parallel GC оптимизирует пропускную способность, а не задержки: при больших кучах его паузы могут быть длинными.
Как отвечать на собеседовании
- Перечислите сборщики в историческом порядке → для каждого назовите флаг, принцип и назначение → объясните устройство G1 по регионам → добавьте ZGC и его миллисекундные паузы → завершите рекомендацией по выбору под требования приложения.