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


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

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

4 78

4 ответа:

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

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

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

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

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

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

параллельный 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>

вывод:

  1. применить - XX: + UseParallelGC, когда вам требуется метод параллельного сбора более молодые только, (но все еще) используйте метод серийной метки-развертки как старый сбор
  2. применить-XX: + UseParallelOldGC, когда вам требуется метод параллельного сбора более молодые генерация (автоматически устанавливает-XX: + UseParallelGC)истарый сбор
  3. применить - XX: + UseParNewGC & - XX: + UseConcMarkSweepGC, когда вам требуется метод параллельного сбора более молодые и требуется метод CMS в качестве вашей коллекции над старый поколение
  4. вы не можете применить-XX:+UseParallelGC или-XX:+UseParallelOldGC с-XX:+UseConcMarkSweepGC одновременно, поэтому ваш require-XX:+UseParNewGC для сопряжения с CMS в противном случае используйте-XX:+UseSerialGC явно или - XX: -UseParNewGC если вы хотите использовать серийный метод против молодого поколения

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

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

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

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

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