Разница между -XX: UseParallelGC и -XX: + UseParNewGC - PullRequest
79 голосов
/ 20 января 2010

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

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

Ответы [ 4 ]

115 голосов
/ 26 января 2010

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

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

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

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

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

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

19 голосов
/ 30 июня 2015

Параллельный ГХ

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

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: + ИспользоватьParallelGC, когда вам требуется метод параллельного сбора в течение МОЛОДОГО поколения ТОЛЬКО , (, но все еще) использовать метод последовательной метки-развертки как СТАРЫЙ поколение коллекции
  2. Применить -XX: + ИспользоватьParallelOldGC, когда вам требуется метод параллельного сбора в течение МОЛОДОГО поколения (автоматически устанавливает -XX: + UseParallelGC) И СТАРЫЙ поколение коллекции
  3. Apply -XX: + UseParNewGC & -XX: + UseConcMarkSweepGC, если вам требуется метод параллельного сбора более YOUNG генерация И требуется метод CMS в качестве сбора более OLD поколение памяти
  4. Вы не можете применить -XX: + UseParallelGC или -XX: + UseParallelOldGC с -XX: + UseConcMarkSweepGC одновременно, поэтому ваш параметр требует -XX: + UseParNewGC для сопряжения с CMS, в противном случае явно используйте -XX: + UseSerialGC ИЛИ -XX: - ИспользуйтеParNewGC, если вы хотите использовать последовательный метод против молодого поколения
15 голосов
/ 20 января 2010

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

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

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

3 голосов
/ 27 января 2015

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

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

...