Когда выбрать SerialGC, ParallelGC над CMS, G1 в Java? - PullRequest
0 голосов
/ 10 февраля 2019

В Java 9 G1 GC является сборщиком мусора по умолчанию.На данный момент я слышал о некоторых людях, предпочитающих сборщик мусора CMS , а не G1GC, поскольку он, кажется, нестабилен и имеет некоторые неприятные ошибки.

Что произошло с ParallelGC (в наши дни не будет шума)?Есть ли какой-либо вариант использования, в котором мы хотели бы отдать предпочтение ParallelGC над CMS / G1?

Кроме того, есть ли случай, когда SerialGC мог бы выполнить все эти параллельные сборщики?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы можете прочитать документацию Платформа Java, стандартное издание Руководство по настройке сборки мусора виртуальной машины HotSpot-Java9

  • Последовательный сборщик

    Это лучше всего подходит дляоднопроцессорные машины, потому что он не может использовать преимущества многопроцессорного оборудования, хотя он может быть полезен на многопроцессорных системах для приложений с небольшими наборами данных (приблизительно до 100 МБ).

  • Параллельный коллектор

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

  • Чаще всего коллекторы (CMS)

Этот коллекторустарела в Java9.

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

  • G1сборщик мусора

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

summery:

  • Ifприложение имеет небольшой набор данных (примерно до 100 МБ), затем выберите последовательный коллектор с параметром -XX: + UseSerialGC.

  • Если приложение будет работать на одномпроцессор и нет требований времени паузы, затем выберите последовательный коллектор с опцией -XX: + UseSerialGC.

  • Если (a) пиковая производительность приложения является первым приоритетом и (b) нет никаких требований времени паузы или паузы в одну секунду или более приемлемы, затем позвольте виртуальной машине выбрать коллектор или выбрать параллельный коллектор с помощью -XX: + UseParallelGC.

  • Есливремя отклика важнее, чем общая пропускная способность, и паузы при сборке мусора должны быть короче, чем приблизительно одна секунда, затем выберите одновременный коллектор с помощью -XX: + UseG1GC или -XX: + UseConcMarkSweepGC.

Вопросы и ответы:

  1. Я слышал, что некоторые люди предпочитают сборщик мусора CMS, а не G1GC, поскольку он кажется нестабильным и имеет некоторые неприятности.ошибки.

Коллектор G1 достаточно стабилен для большинства приложений.Я использовал коллектор G1 для многих приложений, и все они работают хорошо.Если вы сможете обновить java9 до Java11, он будет работать лучше и ошибок будет меньше.

Есть ли какой-либо вариант использования, в котором мы хотели бы предпочесть ParallelGC над CMS / G1?

Да.Некоторые приложения, которые нуждаются в большей пропускной способности и не заботятся о времени паузы с использованием параллельного коллектора, были бы лучше.Например, пакетные задачи, автономные задания, вычисления задач.3. Кроме того, есть ли какой-нибудь случай, когда SerialGC мог бы выполнить все эти параллельные сборщики?

Если вы запускаете jvm во встроенной системе или в какой-либо системе с одним или двумя процессорами, Serial GC будет лучше.

Наконец, G1 VS CMS: В большинстве случаев G1 может заменить CMS.И в таком случае вам лучше использовать G1:

  1. У вас большая куча, как 16G.Существует положительная корреляция между временем паузы и размером кучи. Наоборот, G1 является инкрементным коллектором.
  2. Вы предъявляете строгие требования к времени паузы и хотите больше контроля для времени паузы.Мол, вы хотите, чтобы время паузы <= 10 мс. </li>
0 голосов
/ 10 февраля 2019

Последовательный коллектор

В основном для станка с одним процессором.

Алгоритм:

Для обработки кучи используется один поток,и выполнить паузу остановки мира во время любого gc.Просто посмотри на это как на игрушку.

Это значение по умолчанию для компьютера клиентского класса (32-разрядная версия JVM для Windows или компьютера с одним процессором) .


Параллельный коллектор

Алгоритм:

Он использует несколько потоков gc для обработки кучи и выполнения остановки мира во время любого gc.

<= Java <code>8, это по умолчаниюдля машины серверного класса (многопроцессорная Unix-подобная машина или любая 64-битная jvm).


CMS-сборщик

Предназначена для устранения длительной паузы, связанной с полным gc параллели& serial collector.

Алгоритм:

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


сборщик G1

Это gc с низкой паузой / стилем сервера, в основном для большой кучи (> 4 Гб).

Алгоритм:

  • Подобно CMS, он использует несколько фоновых потоков gc для сканирования и очистки кучи.
  • Itразделив старое поколение на части, можно было бы очистить старое поколение путем копирования из 1 части в другую.
    Таким образом, получить фрагментацию меньше возможно.

Начиная с Java 9, это значение по умолчанию для сервера-класс-машина (многопроцессорная Unix-подобная машина или любая 64-битная jvm).


Зачем использовать G1 по умолчанию?

Основная причина заключается в сокращении времени паузы gc, хотяобщая пропускная способность может быть уменьшена.

...