Создатели JVM Hotspot понимали, что для разных приложений и разных ситуаций требуются разные сборщики мусора. Поэтому в JVM их несколько, и они отличаются своим поведением, скоростью работы и методами сбора мусора. Более того, так как в HotSpot JVM heap делится на несколько поколений, для сбора мусора в каждом из поколений могут использоваться разные сборщики.
Выбор и настройка сборщиков мусора осуществляется с помощью стартовых параметров, которых так много и написано о них столько, что проще дать ссылки.
Если не использовать эти опции, JVM включает дефолтный сборщик мусора (GC, garbage collector). В разных версиях Hotspot JVM он разный:
- Java 8: ParallelGC
- Java 9 и выше: G1GC
Serial GC
Первый, примитивный. Прямой как палка. Для сборки мусора полностью останавливает JVM и собирает мусор в один поток.
Parallel GC
Попытка сделать сборку быстрой и многопоточной. На многоядерных процессорах это хорошо работает. Но все равно для сборки он требует полного останова JVM. Использовался по умолчанию до Java 9. В новых версиях Java он продолжает совершенствоваться и дополняться новыми опциями, так что для каких-то особых приложений можно не обращаться к новым сборщикам мусора. Справится и улучшенный Parallel GC.
CMS GC
Цель этого GC — отсрочить полную сборку мусора с остановом JVM путем запуска маленьких и коротких операций по сбору сведений о мусоре, а потом путём быстрых и коротких операций — убрать, что можно. Если достигается определенный процент использованного heap, т.е. CMS-сборщик видит, что не справляется, то JVM останавливается и происходит полная сборка мусора.
Этот сборщик мусора как правило включают в тяжелых долгоработающих приложениях, которым выделяется много памяти под heap, где допускаются короткие задержки на быстрые легкие стадии сборки мусора, а длинные stop-the-world паузы желательны лишь в редких критических случаях. Типичный пример: J2EE AppServer, который работает круглые сутки и не перегружается месяцами, клиентское Swing/SWT-приложение, тяжелый критический API-сервис, ответы от которого критичны по времени.
На замену ему уже давно вышел сборщик мусора GCG1. В Java 8 сборщик CMS обозначен как deprecated, а в скором будущем CMS будет выпилен из JVM вообще и про него можно будет благополучно забыть.
G1 GC
Впервые появился как экспериментальный в JDK6u14, а начиная с JDK7 Update 4 (JDK 7u4) — как официальный. В Java 9 он теперь включен по умолчанию. Мейнстрим на несколько релизов Java вперед. Поколенческий, как и все предыдущие сборщики, но зоны поколений реализованы несколько иначе. Постоянно совершенствуется. В каждой новой версии Java добавляются новые функции.
Shenandoah GC
Добавили в Java 12 в качестве экспериментального. Бэкпорты перенесены в Java 8 и Java 11 LTS для тех, кто желает пощупать, но не может перейти на Java 12. Разрабывается в компании RedHat (которую недавно купила IBM) Шипилёвым.
Включается следующими опциями в версиях Java до Java 15:
-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoah
В Java 15 теперь он теперь официальный и готов к PROD. В Java 15 -XX:+UnlockExperimentalVMOptions уже не требуется.
ZeroGC
Для очень больших хипов — до нескольких терабайт. Цель — гарантировать паузы на сборку мусора на таком хипе максимум 10 миллисекундами. Появился в Java 11 как экспериментальный. Включается следующими опциями до Java 15:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
В Java 15 теперь он теперь официальный и готов к PROD. В Java 15 -XX:+UnlockExperimentalVMOptions не требуется.
Ниже представлена коллекция ссылок на видео, посвященные сборщику мусора ZGC. Список будет пополняться по мере появления нового об этом сборшике мусора.
- ZGC — Java’s Highly Scalable Low-Latency Garbage Collector
- ZGC: The Future of Low-Latency Garbage Collection Is Here
- ZGC: The Next Generation Low-Latency Garbage Collector
- Z Garbage Collector: The Next Generation
Epsilon GC
Экспериментальный. Не собирает мусор, а только аллоцирует объекты. Предназначен для проверок и замеров. Ну и для тех случаев, когда у вас уже всё настолько вылизано в коде, что осталось только отключить сборщик мусора, чтобы достичь Low-latency нирваны.
Включается следующими оцпиями:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
Выводы
Итак, в текущей версии Java имеется три (ТРИ!) высокопроизводительных сборщика мусора: G1, Zero GC и Shenandoah. Два из них — Zero GC и Shenandoah — экспериментальные (а в Java 15 — уже полноценные), а G1 — готовый для употребления на PROD. Причем все три постоянно будут совершенствоваться с каждым новым 6-месячным релизом Java. Бесплатно.
Разработчики JDK призывают обновлять свои системы до свежих версий, потому что в каждой новой версии JDK работа сборщиков мусора от версии к версии улучшается, ускоряется и добавляются новые возможности и исправляются досадные ошибки.
Для тех, кому нужна еще большая производительность сборщика мусора, могут обратиться к Zing VM, которую предлагает компания Azul Systems. Она позиционирует свою VM и встроенный в нее сборщик мусора C3 — как специально заточеные под чувствительные к latency приложения. Но — за деньги.
Либо, писать Java приложения так, чтобы и бесплатный сборщик мусора справлялся.
Литература
- Real-Time Java Programming with Java RTS — хотя книга посвящена «устаревшей» технологии RTS Java, первые главы книги подробно описывают реализации сборщиков мусора в JVM HotSpot: Serial, Parallel и CMS, которые существовали тогда в JVM на момент написания книги (2009 год). Если вам по какой-то причине надо глубоко разобраться, как эти сборщики работают, это книга вам поможет.
- Java Performance Companion — книга посвящена подробному описанию работы G1 GC
- Garbage Collection: Algorithms for Automatic Dynamic Memory Management — классический труд (издан в 1996 году) на тему сбора мусора, в котором описаны все алгоритмы, реализованные позже в разных виртуальных машинах, включая JVM. Обновленнное спустя 20 лет издание 2016 года называется The Garbage Collection Handbook: The Art of Automatic Memory Management дает обзор технологий автоматической сборки мусора в исторической перспективе.
Ссылки по теме
- Список опций для настройки сборщика мусора в Java 8
- Understanding Java Garbage Collection — лекция Gil Tene, основателя компании Azul, о том, как работает сборщик мусора в Java
- G1: One Garbage Collector To Rule Them All — подробное описание работы G1 GC
Youtube
- 2017.12: Алексей Шипилёв — Shenandoah: сборщик мусора, который смог — презентация о Shenandoah GC от ее автора.
- 2022.05.02: JDK 8 to JDK 18 in Garbage Collection: 10 Releases, 2000+ Enhancements — про улучшения G1 GC на протяжении всех релизов Java.