Параллельный и параллельный сборщик мусора в Java

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

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

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

PS

Я использую JVM6.


person Community    schedule 21.10.2008    source источник
comment
Какую версию JVM вы используете? Есть некоторые различия между 1.4.2 и 5 или 6.   -  person sk.    schedule 21.10.2008
comment
Некоторая путаница может возникнуть из-за выражения «молодое поколение», которое в данном контексте связано с возрастом объектов Java в вашей куче (а не с тем, насколько современен сборщик мусора).   -  person Jonas Byström    schedule 16.10.2013


Ответы (6)


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

Из https://web.archive.org/web/20120624153924/http://java.sun.com/docs/hotspot/gc1.4.2/

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

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

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

person Community    schedule 21.10.2008
comment
я до сих пор не понимаю, поэтому, чтобы включить параллельный сборщик мусора молодого поколения с параллельным сборщиком мусора, мне нужно использовать как concmarksweepgc, так и parnewgc, или подойдет только concmarksweepgc? - person pdeva; 21.10.2008
comment
Просто -XX:+UseConcMarkSweepGC, и я думаю, что флаг UseParNewGC не имеет никакого эффекта (или даже может вызвать ошибку) в Java 6. - person sk.; 21.10.2008
comment
Вы можете проверить с помощью java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -version =› -XX:+UseParNewGC устанавливается автоматически. (Проверено с 1.6.0_26). - person Guillaume Perrot; 19.12.2012

Настройка 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/

person Community    schedule 21.10.2008

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

person Community    schedule 21.10.2008

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

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

person Community    schedule 14.09.2012
comment
Можете ли вы объяснить немного больше об этом? Если вы не делите машину с другими процессами (поэтому простаивающие ядра просто тратятся впустую), используйте ConcMarkSweepGC. ? - person Surasin Tancharoen; 23.03.2016

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

person Community    schedule 05.02.2014

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

person Community    schedule 14.09.2017