Подтвердить что ты не робот

Параллельные и параллельные GC

В этой статье здесь предлагается использовать -XX:+UseParNewGC "Включить параллельную GC молодого поколения с параллельным GC".

Моя путаница в том, что для того, чтобы включить как параллельный, так и параллельный GC, должен ли я

  • используйте -XX:+UseParNewGC или
  • используйте как -XX:+UseParNewGC, так и -XX:+UseConcMarkSweepGC?

PS

Я использую JVM 6.

4b9b3361

Ответ 1

Поскольку документ, на который вы ссылались, был предназначен для виртуальной машины 1.4.2, то, что я предполагаю, вы используете (JVM 5 и 6 ведут себя по-разному).

С http://java.sun.com/docs/hotspot/gc1.4.2/

если -XX: + UseConcMarkSweepGC используется на командная строка затем флаг UseParNewGC также имеет значение true, если оно в противном случае явно не установлен на командная строка

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

Редактировать: для Java 6 тот же флаг (-XX: + UseConcMarkSweepGC) включает одновременный коллектор. Выбор нужного вам коллектора зависит от нескольких вещей, и вам следует протестировать различные конфигурации. Но есть некоторые очень общие рекомендации. Если у вас однопроцессорный однопроцессорный компьютер, то вы должны использовать последовательный коллектор (по умолчанию для некоторых конфигураций можно явно включить для -XX: + UseSerialGC). Для многопроцессорных машин, где ваша рабочая нагрузка в основном связана с процессором, используйте параллельный коллектор. Это включено по умолчанию, если вы используете флаг -server, или вы можете включить его явно с помощью -XX: + UseParallelGC. Если вы предпочитаете сокращать паузы GC за счет использования большего общего времени ЦП для GC, и у вас более одного ЦП, вы можете использовать параллельный коллектор (-XX: + UseConcMarkSweepGC). Обратите внимание, что параллельный сборщик имеет тенденцию требовать больше оперативной памяти, выделенной для JVM, чем последовательный или параллельный сборщики для данной рабочей нагрузки, поскольку может произойти некоторая фрагментация памяти.

Ответ 4

Java GC tuning - это, в основном, темное искусство, но в моем приложении (работает с кучей размером 50 + ГБ и 16 физических ядрах) сборщик ConcMarkSweep привел к 3-кратным ускорениям по сравнению с сервером по умолчанию, а ускорение 2.2x ParallelOldGC.

Если вы не используете машину совместно с другими процессами (так что простаивающие ядра просто теряются) используйте ConcMarkSweepGC.

Ответ 5

ParNew является сборщиком молодого поколения по умолчанию, когда используется CMS. Вам просто нужно указать -XX: + UseConcMarkSweepGC для использования CMS и ParNew будет использоваться по умолчанию. CMS - хороший коллектор, если избегать помех ГК имеет более высокий приоритет, но если пропускная способность более важна, например, для пакетного задания, то по умолчанию SUN-параллельный коллектор выполняет лучшую работу.

Ответ 6

Вы не можете одновременно включить два параметра GC. Я бы предложил вам использовать CMS, который лучше, чем GC следующего поколения, сравнивается с UseParNewGC. и если вы используете Java 1.7 или более позднюю версию, а размер кучи относительно больше (например, > 4 ГБ), используйте G1.