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

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


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

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

Serial

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

Parallel

Попытка сделать сборку быстрой и многопоточной. На многоядерных процессорах это хорошо работает. Но все равно для сборки он требует полного останова JVM.

CMS

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

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

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

G1

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

Постоянно совершенствуется. В новых версиях Java 11 и Java 12 добавляются новые функции.

Shenandoah

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

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

-XX:+UnlockExperimentalVMOptions
-XX:+UseShenandoahGC

ZeroGC

Экспериментальный. Для очень больших хипов — до нескольких терабайт. Цель — гарантировать паузы на сборку мусора максимум 10 миллисекундами.

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

-XX:+UnlockExperimentalVMOptions 

-XX:+UseZGC

Epsilon GC

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

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

-XX:+UnlockExperimentalVMOptions

-XX:+UseEpsilonGC
Реклама

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

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

Логотип WordPress.com

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

Google photo

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

Фотография Twitter

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

Фотография Facebook

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

Connecting to %s