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

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

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


person fglez    schedule 20.01.2010    source источник


Ответы (4)


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

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

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

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

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

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

person fglez    schedule 26.01.2010
comment
Чуть более актуальная ссылка fasterj.com/articles/oraclecollectors1.shtml - person phunehehe; 07.05.2015
comment
@phunehehe Спасибо за ссылку! Это очень полезно. - person The Student Soul; 27.06.2018

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

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

UseParNewGC

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

Возможно, проще всего было понять комбинации алгоритмов сборки мусора, созданные Алексей Рагозин

<table border="1" style="width:100%">
  <tr>
    <td align="center">Young collector</td>
    <td align="center">Old collector</td>
    <td align="center">JVM option</td>
  </tr>
  <tr>
    <td>Serial (DefNew)</td>
    <td>Serial Mark-Sweep-Compact</td>
    <td>-XX:+UseSerialGC</td>
  </tr>
  <tr>
    <td>Parallel scavenge (PSYoungGen)</td>
    <td>Serial Mark-Sweep-Compact (PSOldGen)</td>
    <td>-XX:+UseParallelGC</td>
  </tr>
  <tr>
    <td>Parallel scavenge (PSYoungGen)</td>
    <td>Parallel Mark-Sweep-Compact (ParOldGen)</td>
    <td>-XX:+UseParallelOldGC</td>
  </tr>
  <tr>
    <td>Serial (DefNew)</td>
    <td>Concurrent Mark Sweep</td>
    <td>
      <p>-XX:+UseConcMarkSweepGC</p>
      <p>-XX:-UseParNewGC</p>
    </td>
  </tr>
  <tr>
    <td>Parallel (ParNew)</td>
    <td>Concurrent Mark Sweep</td>
    <td>
      <p>-XX:+UseConcMarkSweepGC</p>
      <p>-XX:+UseParNewGC</p>
    </td>
  </tr>
  <tr>
    <td colspan="2">G1</td>
    <td>-XX:+UseG1GC</td>
  </tr>
</table>

Заключение:

  1. Примените -XX:+UseParallelGC, когда вам требуется метод параллельного сбора поверх поколения YOUNG ТОЛЬКО, (но все же) используйте метод серийной метки-развертки как Коллекция поколения СТАРАЯ
  2. Примените -XX:+UseParallelOldGC, если вам требуется метод параллельного сбора поверх генерации YOUNG (автоматически устанавливает -XX:+UseParallelGC) AND OLD коллекция генерации
  3. Примените -XX:+UseParNewGC и -XX:+UseConcMarkSweepGC, когда вам требуется параллельный метод сбора по сравнению с поколением YOUNG, И требуется метод CMS в качестве сбора по сравнению с OLD память поколений
  4. Вы не можете применять -XX:+UseParallelGC или -XX:+UseParallelOldGC с -XX:+UseConcMarkSweepGC одновременно, поэтому вам требуется, чтобы -XX:+UseParNewGC был связан с CMS, иначе используйте -XX:+UseSerialGC явно ИЛИ -XX:-ИспользуйтеParNewGC, если вы хотите использовать последовательный метод против молодого поколения
person Ivan Herlambang    schedule 30.06.2015
comment
Должно быть -XX:-UseParallelGC. - person Minas Mina; 27.10.2017
comment
Примечание. Вывод №1 больше неверен. Применение -XX:+UseParallelGC приводит к использованию параллельного GC как для молодого, так и для старого GC для современных JVM. См. bugs.openjdk.java.net/browse/ - person turbanoff; 10.04.2019

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

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

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

person Suraj Chandran    schedule 20.01.2010
comment
Знаете ли вы, какие известные ошибки или в какой версии JVM они есть? - person fglez; 20.01.2010

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

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

person Avinash Ganta    schedule 27.01.2015
comment
Это действительно хорошее понимание. Вы проводили какие-либо тесты, чтобы подтвердить это? - person fglez; 29.01.2015