Java 7 (JDK 7) сборка мусора и документация по G1 - PullRequest
79 голосов
/ 13 ноября 2011

Java 7 давно отсутствует, но я не могу найти хороших ресурсов по настройке сборщиков мусора , в частности нового G1 сборщика .

Мои вопросы:

  1. Является ли G1 сборщиком по умолчанию в Java 7, и если нет, то как мне активировать G1?
  2. Какие дополнительные настройки g1 имеет в Java7?
  3. Были ли внесены какие-либо изменения в другие сборщики, такие как cms или параллельный сборщик в Java 7?
  4. Где найти хорошую документацию по сборке мусора в Java 7?

Ответы [ 8 ]

47 голосов
/ 17 ноября 2011

Сборщик мусора G1 не используется по умолчанию в моей установке Java версии 1.7.0_01. Вы можете убедиться сами, используя некоторые дополнительные параметры командной строки:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 PSYoungGen      total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000)
  eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000)
  from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000)
  to   space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000)
 PSOldGen        total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000)
  object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000)
 PSPermGen       total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000)
  object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)

Вам не нужно больше включать экспериментальные опции для включения сборщика G1:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 garbage-first heap   total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000)
  region size 1024K, 1 young (1024K), 0 survivors (0K)
 compacting perm gen  total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)
   the space 20480K,   9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000)
No shared spaces configured.

Я не знаю, где можно найти хорошую документацию.

31 голосов
/ 10 мая 2012

Oracle наконец сделал G1 официальным в Java 7 U4: http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html

Описание: http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

Параметры командной строки: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

Тем не менее, я делаюне думаю, что это сборщик по умолчанию в Java 7. Для серверов по умолчанию используется параллельный сборщик, как в Java 6.

22 голосов
/ 13 ноября 2011

Да, G1 - это новый стандартный сборщик мусора в Java 1.7 JVM.

Здесь вы можете найти много информации о том, как использовать и настроить новый сборщик мусора:

Использование G1 G1 по-прежнему считается экспериментальным и его можно включить с помощью следующих двух параметров:

-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC

Для установки паузы ГХвремя цели, используйте следующий параметр:

-XX: MaxGCPauseMillis = 50 (для цели паузы 50 мс)

С G1 можно указать временной интервал, в течение которого пауза ГХ должнадлятся не дольше указанного выше времени:

-XX: GCPauseIntervalMillis = 200 (для целевого интервала паузы 200 мс)

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

В качестве альтернативы, размер молодого поколения может быть указан явно, чтобы повлиять на время паузы эвакуации:

-XX: + G1YoungGenSize = 512 м (для молодого поколения 512 мегабайт)

G1 также использует эквивалент пространств выживших, которые, естественно, представляют собой набор (потенциально несмежных) областей.Их размер можно указать с помощью обычных параметров (например, -XX: SurvivorRatio = 6).

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

-XX: + G1ParallelRSetUpdatingEnabled -XX: + G1ParallelRSetScanningEnabled

Еще одна вещь, на которую следует обратить внимание, это то, что G1 очень многословен по сравнению с другими GC HotSpot, когда -XX: + PrintGeустановлено.Это связано с тем, что он печатает данные о времени каждого потока GC и другую информацию, очень полезную при профилировании и устранении неполадок.Если вы хотите более краткий журнал GC, переключитесь на использование -verbosegc (хотя рекомендуется получить более подробный журнал GC).

Я также нашел это Статья очень полезна в понимании внутренностей G1.

Еще больше информации здесь .

13 голосов
/ 09 декабря 2013

1.Является ли G1 сборщиком по умолчанию в Java 7 (...)

Правило этой страницы Java 5 все еще применимо в Java 7 (и AFAIK, Java 8):

На машинах серверного класса , на которых запущена виртуальная машина сервера, сборщик мусора (GC) изменился с предыдущего последовательного сборщика (-XX: + UseSerialGC) на параллельный сборщик (-XX: + UseParallelGC).

Но также учтите:

  • 64-битные JVM не поставляются с -client VM, поэтому всегда являются "классом сервера"
  • Начиная с Java 7, использование -XX: + UseParallelGC (заданное или подразумеваемое) дополнительно подразумевает -XX: + UseParallelOldGC (т.е. если явно не отключено)

Например, если в Windows x64вы запускаете ...

  • Java 7 64-bit, вы получаете Parallel GC (для молодого и старого поколений) по умолчанию.
  • Java 8 32-bit, по умолчанию вы получаете Serial GC (для обоих поколений)

1.(...) как активировать G1?

Начиная с Java 7, просто -XX:+UseG1GC.Возможно, также представляет интерес , когда вы бы хотели:

Приложения, работающие сегодня с CMS или сборщиком мусора ParallelOld, выиграют от переключения на G1, если приложение имеет один или несколькоиз следующих черт.

  • Более 50% кучи Java занято живыми данными.
  • Скорость выделения объектов или продвижения значительно варьируется.
  • Нежелательные длительные паузы для сборки мусора или уплотнения (более 0,5 до 1 секунды)

2.Какие дополнительные настройки g1 имеет в Java7?

Я сам не использовал G1, но Я понял , что он придерживается тех же базовых флагов "пропускной способности / эргономики", которые использовались длянастроить другие параллельные коллекторы.По моему опыту с Parallel GC, -XX:GCTimeRatio был ключевым в обеспечении ожидаемого компромисса между скоростью и памятью.YMMV.

Здесь перечислены параметры, специфичные для G1 здесь

3.Были ли изменения в (...) cms или параллельном сборщике в Java 7?

Не знаю, , но ...

G1 планируется в качестве долгосрочной замены для параллельного коллектора с меткой-очисткой (CMS)

4.Где я могу найти хорошую документацию по сборке мусора в Java 7?

Это может быть боль, не так ли?Вероятно, лучшая страница «хаба», которую я нашел, это:

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html

Требуется некоторое глубокое чтение, но оно стоит времени, если вам нужно выполнить некоторые настройки.Особенно проницательным является: Эргономика сборщика мусора

9 голосов
/ 13 декабря 2015
  1. Является ли G1 сборщиком по умолчанию в Java 7, и если нет, то как мне активировать G1?

G1 не является сборщиком по умолчанию в Java 7. -XX:+UseG1GC включит G1GC

  1. Какие дополнительные настройки g1 имеет в Java7?

Их много. Взгляните на эту статью oracle для получения полной информации.

G1 GC - это адаптивный сборщик мусора со значениями по умолчанию, которые позволяют ему работать эффективно без изменений.

По этой причине настраивайте критические параметры

-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads

и оставить все остальные параметры равными значению по умолчанию .

Вот список важных опций и их значения по умолчанию. Этот список применяется к последней версии Java HotSpot VM, сборка 24. Вы можете адаптировать и настроить параметры G1 GC в командной строке JVM.

Важные значения по умолчанию:

-XX:G1HeapRegionSize=n

Устанавливает размер области G1. Значение будет иметь степень двойки и может варьироваться от 1 до 32 МБ. Цель - создать около 2048 регионов на основе минимального размера кучи Java.

-XX:MaxGCPauseMillis=200

Устанавливает целевое значение для желаемого максимального времени паузы. Значение по умолчанию составляет 200 миллисекунд. Указанное значение не адаптируется к вашему размеру кучи.

-XX:G1NewSizePercent=5

Устанавливает процент кучи для использования в качестве минимума для размера молодого поколения. Значение по умолчанию составляет 5 процентов вашей кучи Java.

-XX:G1MaxNewSizePercent=60

Устанавливает процент от размера кучи для использования в качестве максимума для размера молодого поколения. Значение по умолчанию составляет 60 процентов вашей кучи Java.

-XX:ParallelGCThreads=n

Устанавливает значение рабочих потоков STW. Устанавливает значение n в число логических процессоров. Значение n совпадает с числом логических процессоров до значения 8.

Если существует более восьми логических процессоров, установите значение n равным приблизительно 5/8 логических процессоров. Это работает в большинстве случаев, за исключением больших систем SPARC, где значение n может составлять примерно 5/16 от логических процессоров.

-XX:ConcGCThreads=n

Устанавливает количество параллельных разметочных нитей. Устанавливает n равным приблизительно 1/4 от числа параллельных потоков сборки мусора (ParallelGCThreads).

-XX:InitiatingHeapOccupancyPercent=45

Устанавливает порог занятости кучи Java, который запускает цикл маркировки. Занятость по умолчанию составляет 45 процентов всей кучи Java.

-XX:G1MixedGCLiveThresholdPercent=65

Устанавливает порог занятости для старого региона, который будет включен в цикл смешанного сбора мусора. Заполняемость по умолчанию составляет 65 процентов

-XX:G1HeapWastePercent=10

Устанавливает процент кучи, которую вы готовы тратить. Виртуальная машина Java HotSpot не запускает цикл смешанного сбора мусора, когда процент извлечения меньше, чем процент отходов кучи

-XX:G1MixedGCCountTarget=8

Устанавливает целевое число смешанных сборок мусора после цикла маркировки для сбора старых областей с не более чем G1MixedGCLIveThresholdPercent живых данных. По умолчанию используется 8 смешанных сборок мусора

-XX:G1OldCSetRegionThresholdPercent=10

Устанавливает верхний предел на количество старых областей, которые будут собираться во время смешанного цикла сбора мусора. По умолчанию используется 10% кучи Java

-XX:G1ReservePercent=10

Устанавливает процентную долю резервной памяти, которая остается свободной, чтобы снизить риск переполнения пространства. По умолчанию это 10 процентов. При увеличении или уменьшении процентного соотношения обязательно измените общую кучу Java на ту же величину.

Вы перенастроили многие параметры G1GC, которые не требуются, если вы следуете вышеупомянутой странице документации. Пожалуйста, перепроверьте приведенные выше рекомендации, особенно для ParallelGCThreads и ConcGCThreads , которые должны основываться на ядрах вашего процессора. Удалите перенастройку ненужных параметров.

Рекомендации от оракула:

Когда вы оцениваете и настраиваете G1 GC, помните о следующих рекомендациях:

  1. Размер молодого поколения : Избегайте явного задания размера молодого поколения с помощью параметра -Xmn или любого другого параметра, например -XX:NewRatio. Исправление размера молодого поколения отменяет целевую цель паузы времени .

  2. Цели паузы: При оценке или настройке любой сборки мусора всегда существует компромисс между задержкой и пропускной способностью. G1 GC - это инкрементный сборщик мусора с равномерными паузами, но также с большими накладными расходами в потоках приложения. Цель пропускной способности для G1 GC - 90% времени приложения и 10% времени сбора мусора .

  1. Были ли какие-либо изменения в других сборщиках, таких как cms или параллельный сборщик в Java 7?

В Java 7 есть некоторые изменения. Взгляните на эту статью

  1. Где найти хорошую документацию по сборке мусора в Java 7?

См. Страницу документации оракула о gc и связанных с ним вопросах SE:

Сборка мусора Java G1 в производстве

2 голосов
/ 27 апреля 2012

Нет. G1 не является сборщиком мусора по умолчанию в jdk 1.7.0_02. Сборщик мусора по умолчанию зависит от класса машины. Если компьютер относится к классу Server, то сборщик мусора по умолчанию - это Throughput Collector. Если компьютер относится к классу Client, то сборщик мусора по умолчанию - Serial Collector.

2 голосов
/ 17 января 2012

Документация, доступная по адресу http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html (ссылка, предоставленная Wojtek), кажется единственной официальной ссылкой с информацией, но информация кажется устаревшей, так как некоторые из упомянутых флагов были доступны только в тестовых сборках, они больше не существует в производственных выпусках. Кто-то из Oracle должен предоставить обновленную документацию по G1 GC.

0 голосов
/ 09 января 2015

По умолчанию вы не хотите использовать коллектор G1, так как он не лучше других. Это хорошо только для специальных целей.

В приложениях с малой задержкой это чуть лучше, чем CMS, так как оно немного короче и более предсказуемо. Взамен пропускная способность намного хуже, чем CMS взамен.

Так что хорошо, если задержка важна, но пропускная способность вообще не важна. Если оба важны, оставайтесь с CMS.

...