Разница между -XX: + UseParallelGC и -XX: + UseParNewGC

83

Это алгоритмы для сборки мусора молодого поколения.

Второй (UseParNewGC) активируется автоматически с одновременной сборкой мусора временного поколения (см. Java Concurrent и Parallel GC ), но есть ли разница между двумя параллельными алгоритмами?

fglez
источник

Ответы:

119

После долгих поисков лучшее объяснение, которое я нашел, было найдено на веб-сайте настройки производительности Java в Вопросе месяца: 1.4.1 Алгоритмы сборки мусора, 29 января 2003 г.

Алгоритмы сборки мусора молодого поколения

(Оригинал) копирование коллектор (по умолчанию включено). Когда срабатывает этот сборщик, все потоки приложения останавливаются, и копирование коллекции продолжается с использованием одного потока (что означает только один ЦП, даже если на многопроцессорной машине). Это известно как коллекция stop-the-world, потому что в основном JVM приостанавливает все остальное, пока коллекция не будет завершена.

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

Параллельно продувочного коллектор (Включено с помощью -XX: UseParallelGC). Это похоже на предыдущий сборщик параллельного копирования, но алгоритм настроен для гигабайтных куч (более 10 ГБ) на многопроцессорных машинах. Этот алгоритм сбора данных разработан для максимального увеличения пропускной способности при минимизации пауз. У него есть дополнительная политика адаптивной настройки, которая автоматически изменяет размер пространства кучи. Если вы используете этот коллектор, вы можете использовать только оригинальный коллектор mark-sweep в старом поколении (т. Е. Более новый одновременный коллектор старого поколения не может работать с этим коллектором молодого поколения).

Из этой информации кажется, что главное отличие (помимо сотрудничества с CMS) в том, что UseParallelGC поддерживает эргономику, а UseParNewGC - нет.

fglez
источник
3
Чуть более актуальная ссылка fastj.com/articles/oraclecollectors1.shtml
phunehehe
@phunehehe Спасибо за ссылку! Это очень полезно.
Душа студента
21

Параллельный сборщик мусора

  • XX: + UseParallelGC Использовать параллельную сборку мусора для очистки. (Введено в 1.4.1)
  • XX: + UseParallelOldGC Использовать параллельную сборку мусора для полных сборок. Включение этой опции автоматически устанавливает -XX: + UseParallelGC. (Представлено в обновлении 6 5.0).

UseParNewGC

UseParNewGC Параллельная версия копирующего сборщика молодого поколения используется с параллельным сборщиком (то есть, если -XX: + UseConcMarkSweepGC используется в командной строке, то флаг UseParNewGC также устанавливается в значение true, если он явно не установлен в командной строке. ).

Пожалуй, самый простой способ разобраться - это комбинации алгоритмов сборки мусора, разработанные Алексеем Рагозиным.

Заключение:

  1. Применяет -XX: + UseParallelGC , когда вам требуется параллельный метод сбора над МОЛОДЫМ поколением ТОЛЬКО , ( но все же) использование метода последовательной наценки развертка , как OLD коллекции поколения
  2. Примените -XX: + UseParallelOldGC, если вам требуется метод параллельного сбора для создания YOUNG (автоматически устанавливает -XX: + UseParallelGC) И СТАРЫЙ коллекция поколения
  3. Примените -XX: + UseParNewGC & -XX: + UseConcMarkSweepGC, если вам требуется метод параллельного сбора для МОЛОДОЙ генерации И требуется метод CMS в качестве вашей коллекции для СТАРОЙ памяти поколения
  4. Вы не можете применить -XX: + UseParallelGC или -XX: + UseParallelOldGC с -XX: + UseConcMarkSweepGC одновременно, поэтому ваш require -XX: + UseParNewGC должен быть связан с CMS, иначе используйте -XX: + UseSerialGC явно OR -XX: - UseParNewGC, если вы хотите использовать серийный метод против молодого поколения
Иван Херламбанг
источник
Должно быть -XX:-UseParallelGC.
Минас Мина
Примечание: вывод №1 больше не верен. Применение -XX:+UseParallelGCприводит к использованию параллельного GC как для молодого, так и для старого GC для современных JVM. См. Bugs.openjdk.java.net/browse/…
turbanoff
15

UseParNewGC, который обычно называют «параллельным сборщиком молодого поколения», во всех отношениях аналогичен параллельному сборщику мусора (-XX: + UseParallelGC), за исключением того, что он более сложен и эффективен. Также его можно использовать с «параллельным сборщиком малой паузы».

См. FAQ по Java GC. , вопрос 22 для получения дополнительной информации.

Обратите внимание, что в UseParNewGC есть несколько известных ошибок.

Сурадж Чандран
источник
8
Вы знаете, какие известные ошибки или в какой версии JVM они есть?
fglez
4

Использование -XX: + UseParNewGC вместе с -XX: + UseConcMarkSweepGC приведет к увеличению времени паузы для второстепенных GC по сравнению с -XX: + UseParallelGC.

Это связано с тем, что для продвижения объектов из молодого в старое поколение потребуется запустить алгоритм Best-Fit (из-за фрагментации старого поколения), чтобы найти адрес для этого объекта.
При использовании -XX: + UseParallelGC запуск такого алгоритма не требуется, так как + UseParallelGC можно настроить только с помощью MarkandCompact Collector, и в этом случае фрагментация отсутствует.

Авинаш Ганта
источник
Это действительно хорошее понимание. Вы проводили какие-либо тесты, чтобы подтвердить это?
fglez