Вопрос

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

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

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

PS

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

Это было полезно?

Решение

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

От http://java.sun.com/docs/hotspot/gc1.4.2/

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top