Доступные сборщики мусора в Java

Java HotSpot VM включает в себя три различных типа сборщиков мусора, каждый с различными характеристиками производительности.

Последовательный сборщик (Serial Collector)

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

Он лучше всего подходит для однопроцессорных компьютеров, поскольку не может использовать преимущества многопроцессорного оборудования, хотя может быть полезен для многопроцессорных систем для приложений с небольшими наборами данных (примерно до 100 МБ). Последовательный коллектор выбирается по умолчанию в определенных конфигурациях оборудования и операционной системы или может быть явно включен с помощью опции -XX:+UseSerialGC.

Параллельный сборщик (Parallel Collector)

Параллельный сборщик также известен как сборщик пропускной способности, это сборщик, использующий поколения объектов, похожий на последовательный сборщик. Основное различие между последовательным и параллельным сборщиками состоит в том, что параллельный сборщик имеет несколько потоков, которые используются для ускорения сбора мусора.

Параллельный коллектор предназначен для приложений с наборами данных среднего и большого размера, которые работают на многопроцессорном или многопоточном оборудовании. Вы можете включить его с помощью опции -XX:+UseParallelGC.

Параллельное сжатие - это функция, которая позволяет параллельному сборщику выполнять большие сборки параллельно. Без параллельного сжатия большие сборки выполняются с использованием одного потока, что может значительно ограничить масштабируемость. Параллельное сжатие включено по умолчанию, если была указана опция -XX:+UseParallelGC. Вы можете отключить его, используя опцию -XX:-UseParallelOldGC.

Преимущественно конкурентные сборщики (The Mostly Concurrent Collectors)

Конкурентный сборщик меток (CMS, Concurrent Mark Sweep) и Garbage-First сборщик мусора (G1) являются двумя преимущественно конкурентными сборщиками. Преимущественно конкурентные сборщики выполняют дорогостоящую работу одновременно с приложением.

Сборщик мусора G1: этот серверный сборщик предназначен для многопроцессорных машин с большим объемом памяти. Он с высокой вероятностью отвечает целям времени сбора мусора, обеспечивая при этом высокую пропускную способность.

G1 выбирается по умолчанию для определенных конфигураций оборудования и операционной системы или может быть явно включен с помощью -XX:+UseG1GC.

Сборщик CMS: этот сборщик предназначен для приложений, которые предпочитают более короткие паузы сборки мусора и могут позволить себе совместно использовать ресурсы процессора со сборщиком мусора.

Используйте параметр -XX:+UseConcMarkSweepGC, чтобы включить сборщик CMS.

Сборщик CMS устарел с JDK 9.

Z сборщик мусора

Z сборщик мусора (ZGC) - это масштабируемый сборщик мусора с малой задержкой. ZGC выполняет всю дорогостоящую работу конкурентно, не останавливая выполнение потоков приложения.

ZGC предназначен для приложений, которые требуют малой задержки (паузы менее 10 мс) и/или используют очень большую кучу (heap) (мульти-терабайты). Вы можете включить его, используя опцию -XX:+UseZGC.

ZGC доступен в качестве экспериментальной функции, начиная с JDK 11.

Выбор сборщика

Если ваше приложение не предъявляет достаточно строгих требований к времени паузы, сначала запустите ваше приложение и позвольте виртуальной машине выбрать сборщик.

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

  • Если приложение имеет небольшой набор данных (примерно до 100 МБ), выберите последовательный сборщик с параметром -XX:+UseSerialGC.
  • Если приложение будет запущено на одном процессоре и нет требований к паузе, выберите последовательный сборщик с параметром -XX: + UseSerialGC.
  • Если пиковая производительность приложения является первым приоритетом и нет требований по времени паузы или допустимы паузы в одну секунду или более, тогда позвольте виртуальной машине выбрать сборщик или выберите параллельный сборщик с помощью -XX:+UseParallelGC.
  • Если время отклика важнее, чем общая пропускная способность, и паузы при сборке мусора должны быть короче, чем примерно одна секунда, выберите преимущественно конкурентный сборщик с -XX:+UseG1GC или -XX:+UseConcMarkSweepGC.
  • Если время отклика имеет высокий приоритет и/или вы используете очень большую кучу, выберите полностью конкурентный сборщик с -XX:UseZGC.

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

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


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки