Різниця між -XX: + UseParallelGC та -XX: + UseParNewGC


83

Вони є алгоритмами збору сміття молодого покоління.

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

Відповіді:


119

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

Алгоритми вивезення сміття молодого покоління

(Оригінал) копіювання колектор (за замовчуванням включено). Коли цей колектор запускається, усі потоки додатків зупиняються, і колекція копіювань продовжується за допомогою одного потоку (що означає лише один процесор, навіть якщо на машині з декількома процесорами). Це відоме як колекція “зупини світ”, оскільки в основному JVM робить паузу на все інше, доки колекція не буде завершена.

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

Паралельно продувочного колектор (Включено з допомогою -XX: UseParallelGC). Це схоже на попередній колектор паралельних копій, але алгоритм налаштований на гігабайтні маси (більше 10 ГБ) на машинах з декількома процесорами. Цей алгоритм збору призначений для максимізації пропускної здатності при мінімізації пауз. Він має необов’язкову політику адаптивного налаштування, яка автоматично змінює розмір кучи. Якщо ви використовуєте цей колектор, ви можете використовувати лише оригінальний колектор розгортки міток у старому поколінні (тобто нове одночасне колектор старого покоління не може працювати з цим колектором молодого покоління).

З цієї інформації, здається, головна відмінність (крім співпраці з CMS) полягає в тому, що UseParallelGC підтримує ергономіку, тоді як UseParNewGC не підтримує.


3
Трохи більш сучасне посилання quickj.com/articles/oraclecollectors1.shtml
phunehehe

@phunehehe Дякую за посилання! Це дуже корисно.
Студентська душа,

21

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

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

UseParNewGC

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

Мабуть, найпростіший спосіб зрозуміти це комбінації алгоритмів вивезення сміття, створені Олексієм Рагозіним

Висновок:

  1. Застосовуйте -XX: + UseParallelGC, коли вам потрібен метод паралельного збору ТІЛЬКИ МОЛОДОГО покоління , ( але все-таки) використовуйте метод послідовного позначення-розгортки як збір старого покоління
  2. Застосовує -XX: + UseParallelOldGC , коли вам потрібно паралельний метод збору над МОЛОДИМ поколінням (автоматично встановлює -XX: + UseParallelGC) І СТАРА колекція покоління
  3. Застосуйте -XX: + UseParNewGC & -XX: + UseConcMarkSweepGC, коли вам потрібен метод паралельного збору для МОЛОДОГО покоління І потрібен метод CMS як вашої колекції над пам'яттю старого покоління.
  4. Ви не можете одночасно застосувати -XX: + UseParallelGC або -XX: + UseParallelOldGC з -XX: + UseConcMarkSweepGC, тому вам потрібно -XX: + UseParNewGC для поєднання з CMS, інакше використовуйте -XX: + UseSerialGC явно OR -XX: - UseParNewGC, якщо ви хочете використовувати послідовний метод проти молодого покоління

Має бути -XX:-UseParallelGC.
Мінас Міна,

Примітка: Висновок №1 вже не правильний. Застосування -XX:+UseParallelGCпотенційних клієнтів для використання паралельних ГК як для молодих, так і для старих ГК для сучасних JVM. Дивіться bugs.openjdk.java.net/browse/…
turbanoff

15

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

Докладнішу інформацію див. У розділі поширених запитань щодо Java GC , запитання 22.

Зверніть увагу, що з UseParNewGC є деякі відомі помилки


8
Чи знаєте ви, які відомі помилки чи яка версія JVM має їх?
fglez

4

Використання -XX: + UseParNewGC разом із -XX: + UseConcMarkSweepGC, спричинить більший час паузи для Малих GC, порівняно з -XX: + UseParallelGC.

Це пов’язано з тим, що для просування об’єктів від молодого до старого покоління потрібно буде запустити алгоритм Best-Fit (через фрагментацію старого покоління), щоб знайти адресу для цього об’єкта.
Запуск такого алгоритму не потрібен при використанні -XX: + UseParallelGC, оскільки + UseParallelGC можна налаштувати лише за допомогою MarkandCompact Collector, і в цьому випадку фрагментація відсутня.


Це справді хороше розуміння. Ви проводили якісь тести, щоб підтвердити це?
fglez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.