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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Parallel GC

  • 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>

Ответ 4

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

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