Java Concurrent и Parallel GC - PullRequest
       28

Java Concurrent и Parallel GC

36 голосов
/ 21 октября 2008

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

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

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

PS

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

Ответы [ 6 ]

38 голосов
/ 21 октября 2008

Поскольку документ, на который вы ссылались, был предназначен для виртуальной машины 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, чем последовательный или параллельный сборщики для данной рабочей нагрузки, поскольку может произойти некоторая фрагментация памяти.

7 голосов
/ 21 октября 2008

Java / JDK 6 GC настройка: http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html. Это от SUN (сейчас Oracle). Полный материал.

Также см.
http://kirk.blog -city.com / is_your_concurrent_collector_failing_you.htm
http://www.javaperformancetuning.com/

7 голосов
/ 21 октября 2008

В этой записи блога представлена ​​хорошая разбивка по различным коллекционерам, и какие параметры действительны: http://blogs.oracle.com/jonthecollector/entry/our_collectors

5 голосов
/ 14 сентября 2012

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

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

1 голос
/ 05 февраля 2014

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

0 голосов
/ 14 сентября 2017

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

...