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

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

Мои вопросы:

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

Ответ 1

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

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

Ответ 2

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. Для серверов по умолчанию используется Parallel Collector, как в Java 6.

Ответ 3

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

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

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

-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC

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

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

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

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

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

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

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

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

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

-XX: + G1ParallelRSetUpdatingEnabled -XX: + G1ParallelRetScanningEnabled

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

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

Еще больше здесь.

Ответ 4

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

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

В server-class машины, на которых запущена VM сервера, сборщик мусора (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 планируется как долгосрочная замена для Concurrent Mark-Sweep Collector (CMS)

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

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

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

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

Ответ 5

  • Является ли 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, сборке 24. Вы можете настроить и настроить настройки GC G1 в командной строке JVM.

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

-XX:G1HeapRegionSize=n

Устанавливает размер области G1. Значение будет иметь мощность 2 и может варьироваться от 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

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

-XX:G1MixedGCCountTarget=8

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

-XX:G1OldCSetRegionThresholdPercent=10

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

-XX:G1ReservePercent=10

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

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

Рекомендации от oracle:

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

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

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

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

В Java есть некоторые изменения. Посмотрите на статью

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

Обратитесь к странице документации oracle о gc и соответствующем вопросе SE:

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

Ответ 6

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

Ответ 7

Нет G1 не является сборщиком мусора по умолчанию в jdk 1.7.0_02. По умолчанию сборщик мусора зависит от класса машины. Если машина относится к классу Server, то сборщик мусора по умолчанию является сборщиком пропускной способности. Если машина принадлежит классу Client, то сборщик мусора по умолчанию представляет собой Serial Collector.

Ответ 8

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

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

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