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

Создатели JVM Hotspot понимали, что для разных приложений и разных ситуаций требуются разные сборщики мусора. Поэтому в JVM их несколько, и они отличаются своим поведением, скоростью работы и методами сбора мусора. Более того, так как в HotSpot JVM heap делится на несколько поколений, для сбора мусора в каждом из поколений могут использоваться разные сборщики.


Выбор и настройка сборщиков мусора осуществляется с помощью стартовых параметров, которых так много и написано о них столько, что проще дать ссылки.

Если не использовать эти опции, JVM включает дефолтный сборщик мусора. В разных версиях Hotspot JVM он разный:

  • Java 8: ParallelGC
  • Java 9 и выше: G1GC

Serial

Первый, примитивный. Прямой как палка. Для сборки мусора полностью останавливает JVM и собирает мусор в один поток.

Parallel

Попытка сделать сборку быстрой и многопоточной. На многоядерных процессорах это хорошо работает. Но все равно для сборки он требует полного останова JVM. Использовался по умолчанию до Java 9. В новых версиях Java он продолжает совершенствоваться и дополняться новыми опциями, так что для каких-то особых приложений можно не обращаться к новым сборщикам мусора. Справится и улучшенный Parallel GC.

CMS

Цель — отсрочить полную сборку мусора с остановом JVM путем маленьких и коротких операций по сбору сведений о мусоре, а потом путём быстрых и коротких операций — убрать, что можно. Если достигается определенный процент использованного heap, т.е. CMS-сборщик видит, что не справляется, то JVM останавливается и происходит полная сборка мусора.

Этот сборщик мусора как правило включают в тяжелых долгоработающих приложениях, которым выделяется много памяти под heap, где допускаются короткие задержки на быстрые легкие стадии сборки мусора, а длинные stop-the-world паузы желательны лишь в редких критических случаях.

На замену ему уже давно вышел сборщик мусора G1. В Java 8 CMS теперь обозначен как deprecated, а в скором будущем CMS будет выпилен из JVM и про него можно будет благополучно забыть.

G1

Впервые появился как экспериментальный в JDK6u14, а начиная с JDK7 Update 4 — как официальный. В Java 9 он теперь включен по умолчанию. Мейнстрим на несколько релизов Java вперед. Поколенческий, как и все предыдущие сборщики, но зоны поколений реализованы несколько иначе. Постоянно совершенствуется. В новых версиях Java 11 и Java 12 добавляются новые функции.

Shenandoah

Добавили в Java 12 в качестве экспериментального. Бэкпорты перенесены в Java 8 и Java 11 для тех, кто желает пощупать, но не может перейти на Java 12. Разрабывается в компании RedHat Шипилёвым. В Java 15 теперь он теперь официальный и готов к PROD.

Включается следующими опциями до Java 15:

-XX:+UnlockExperimentalVMOptions
-XX:+UseShenandoah

В Java 15 -XX:+UnlockExperimentalVMOptions не требуется.

ZeroGC

Для очень больших хипов — до нескольких терабайт. Цель — гарантировать паузы на сборку мусора на таком хипе максимум 10 миллисекундами. Появился в Java 11 как экспериментальный. В Java 15 теперь он теперь официальный и готов к PROD.

Включается следующими опциями до Java 15:

-XX:+UnlockExperimentalVMOptions 

-XX:+UseZGC

В Java 15 -XX:+UnlockExperimentalVMOptions не требуется.

Epsilon GC

Экспериментальный. Не собирает мусор, а только аллоцирует объекты. Предназначен для проверок и замеров. Ну и для тех случаев, когда у вас все уже настолько вылизано в коде, что осталось только отключить сборщик мусора, чтобы достичь Low-latency нирваны.

Включается следующими оцпиями:

-XX:+UnlockExperimentalVMOptions

-XX:+UseEpsilonGC

Выводы

Итак, в текущей версии Java имеется три (ТРИ!) высокопроизводительных сборщика мусора: G1, Zero GC и Shenandoah. Два из них Zero GC и Shenandoah — экспериментальные (а в Java 15 — уже полноценные), а G1 — готовый для употребления на PROD. Причем все три постоянно будут совершенствоваться с каждым новым 6-месячным релизом Java. Бесплатно.

Для тех, кому нужна еще большая производительность сборщика мусора, могут обратиться к Zing VM, которую предлагает компания Azul Systems, и которая позиционирует свою VM и встроенный в нее сборщик мусора C3 — как специально заточеные под чувствительные к latency приложения. Но за деньги.

Либо, писать Java приложения так, чтобы и бесплатный сборщик мусора справлялся.

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

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

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

Логотип WordPress.com

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

Google photo

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

Фотография Twitter

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

Фотография Facebook

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

Connecting to %s