Java 7 (JDK 7) сборка мусора и документация по G1

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

Мои вопросы:

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

8 ответов

Сборщик мусора 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.

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

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

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

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

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

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

-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC

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

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

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

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

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

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

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

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

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

-XX: + G1ParallelRSetUpdatingEnabled -XX: + G1ParallelRSetScanningEnabled

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

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

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

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

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

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

Здесь очень много. Посмотрите на эту статью оракула для полной информации.

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 на ту же величину.

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

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

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

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

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

  • 64-битные JVM не поставляются с -client ВМ, так что всегда "серверный класс"
  • Начиная с 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, но я понял, что он придерживается тех же базовых флагов "пропускная способность / эргономика", которые используются для настройки других параллельных сборщиков. По моему опыту с параллельным 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

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

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

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

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

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

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

Другие вопросы по тегам