Сборщики мусора в Java

Создатели 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. Список будет пополняться по мере появления нового об этом сборшике мусора.

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 дает обзор технологий автоматической сборки мусора в исторической перспективе.

Ссылки по теме

Youtube

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s