Gymterview
middle

Какие разновидности сборщиков мусора реализованы в виртуальной машине HotSpot?

Java HotSpot VM предоставляет разработчикам на выбор четыре различных сборщика мусора:

  • Serial (последовательный) — самый простой вариант для приложений с небольшим объемом данных и не требовательных к задержкам. На данный момент используется сравнительно редко, но на слабых компьютерах может быть выбран виртуальной машиной в качестве сборщика по умолчанию. Использование Serial GC включается опцией -XX:+UseSerialGC.
  • Parallel (параллельный) — наследует подходы к сборке от последовательного сборщика, но добавляет параллелизм в некоторые операции, а также возможности по автоматической подстройке под требуемые параметры производительности. Параллельный сборщик включается опцией -XX:+UseParallelGC.
  • Concurrent Mark Sweep (CMS) — нацелен на снижение максимальных задержек путем выполнения части работ по сборке мусора параллельно с основными потоками приложения. Подходит для работы с относительно большими объемами данных в памяти. Использование CMS GC включается опцией -XX:+UseConcMarkSweepGC.
  • Garbage-First (G1) — создан для замены CMS, особенно в серверных приложениях, работающих на многопроцессорных серверах и оперирующих большими объемами данных. G1 включается опцией Java -XX:+UseG1GC. Начиная с Java 9, G1 является сборщиком мусора по умолчанию.
  • ZGC (Z Garbage Collector) — сборщик мусора с низкой задержкой, появившийся как экспериментальный в Java 11 и ставший продакшен-готовым начиная с Java 15. ZGC обеспечивает паузы менее 1 миллисекунды (sub-millisecond) независимо от размера кучи, поддерживает кучи от 8 МБ до 16 ТБ. Включается опцией -XX:+UseZGC.
  • Shenandoah — сборщик мусора с низкой задержкой, разработанный Red Hat. Как и ZGC, выполняет большую часть работы по сборке мусора параллельно с потоками приложения, обеспечивая предсказуемо низкие паузы. Включается опцией -XX:+UseShenandoahGC.

Примечание: Сборщик CMS (Concurrent Mark Sweep) был объявлен устаревшим (deprecated) начиная с Java 9 (JEP 291) и полностью удалён в Java 14 (JEP 363).