Подробное объяснение сборки мусора JVM

JVM

предисловие

В последнее время в сети появилась проблема частого FGC JVM, я перепросил много информации, связанной с GC, и сделал некоторую сортировку и перевод. Статья относительно длинная и ее можно читать медленно после сбора.

1. Что такое сборка мусора? (Вывоз мусора)

Сборщик мусора имеет три обязанности:

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

упоминается здесь有引用Относится к уцелевшему объекту, и позже будут упомянуты некоторые алгоритмы для определения того, является ли объект живым. Объекты, на которые больше не ссылаются, будут считаться мертвыми, что часто называют мусором.garbage. Процесс поиска и освобождения пространства, занятого этими мусорными объектами, называется сборкой мусора.garbage collection.

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

2. Какие характеристики нужны идеальному сборщику мусора?

  1. Сборщики мусора должны быть безопасными и комплексными. Это означает, что живые объекты никогда не должны освобождаться, вместо этого объекты мусора должны собираться за очень небольшое количество циклов сборки мусора.
  2. Сборка мусора должна быть эффективной и не допускать длительных пауз в работе программ.
  3. Дефрагментация памяти.После сбора мусора в памяти будет много прерывистых фрагментов памяти, что может привести к тому, что большие объекты не смогут выделить достаточно непрерывной памяти.
  4. Масштабируемость: в многопроцессорных системах и многопоточных приложениях выделение памяти и сбор мусора не могут стать узкими местами производительности.

3. Выбор дизайна

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

  • Последовательный против параллельного

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

  • Параллелизм против стоп-слова

Параллелизм относится к одновременному выполнению потоков сборки мусора и потоков приложения.stop-the-wordОбе ситуации не исключают друг друга во время выполнения сборки мусора. НапримерCMS,G1уборщик мусора. Параллельный сборщик мусора выполняет свои задачи по сборке мусора одновременно, однако также могут быть шаги, которые необходимо выполнить.stop-the-worldМетод выполняется, что приводит к приостановке приложения. с параллелизмомGCв сравнении с,Stop-the-worldGC формулы проще.

  • Организовывать, не организовывать и дублировать

Это описание в основном касается того, как обрабатывается фрагментация памяти после сборки мусора.

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

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

4. Объект живой?

JvmЧтобы переработать объект, вы должны знать, жив ли объект, то есть существует ли действующая ссылка? Ввести несколько алгоритмов для определения того, является ли объект мертвым.

  1. подсчет ссылок Добавляет счетчик ссылок к объекту, увеличивает счетчик ссылок каждый раз, когда на него делается ссылка, и уменьшает счетчик ссылок по истечении срока действия ссылки. Когда счетчик ссылок равен 0, это означает, что текущий объект может быть переработан. Этот алгоритм прост в реализации и обладает высокой эффективностью суждения, но он не может решить проблему циклических ссылок, то есть объект A ссылается на B, а объект B также ссылается на A, тогда и A, и B имеют ссылки, и их количество приложений равно единице, но на самом деле их можно переработать.

  2. Алгоритмы анализа достижимости Алгоритм определяет то, что называетсяGC Rootкорневой объект, когда у объекта нет цепочки ссылок для достижения этихGC Rootопределяется как подлежащий вторичной переработке объект.

    image

V. Алгоритм сбора поколений

Когда используется метод, называемый коллекцией поколений, память делится на разные поколения, т. е. объекты хранятся в разных пулах объектов в соответствии с их возрастом. Например, наиболее широко используемое поколение состоит в том, чтобы разделить объекты на объекты молодого поколения и объекты старого поколения.

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

Большинство объектов, выделяющих память, живут недолго и умирают в молодом поколении; Немногие объекты меняются от старого поколения к молодому поколению. Сборка мусора объектов молодого поколения происходит относительно часто, а также более эффективно и быстро, потому что память, занимаемая объектами молодого поколения, обычно меньше, и легче определить, на какие объекты больше нельзя ссылаться.

Когда некоторые объекты переживают несколько сборок мусора молодого поколения, эти объекты повышаются до старого поколения. Как правило, память, занимаемая старым поколением, будет больше, чем у молодого поколения, и она будет постепенно увеличиваться в любое время. В результате сборка мусора старого поколения будет выполняться не так часто, а время выполнения будет значительно больше.

image

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

6. Коллекция поколения HotSpot

В основном ввести несколько общих сборщиков мусора串行收集器(Serial Collector),并行垃圾收集器(Parallel Collector),并行整理收集器(Parallel Compacting Collector),并发标记清理垃圾收集器(Concurrent Mark-Sweep,CMS),Garbage-First (G1)Представления с линиями на рисунке можно использовать в комбинации.

6.1 Разделение поколений в HotSpot

В виртуальной машине Java HotSpot память делится на три поколения: молодое поколение, старое поколение и бессмертное поколение (java8 отменил постоянное поколение). Большинство объектов изначально размещаются в памяти молодого поколения, объекты молодого поколения, пережившие несколько сборок мусора, будут переданы старому поколению. Некоторые более крупные объекты могут быть в старом возрасте, когда они созданы. В молодом поколении есть три раздела, одна область Эдема и две области Выживших (ОТ, ДО), как показано на рисунке. Большинство объектов изначально размещаются в области Эдема (однако, как упоминалось ранее, некоторые более крупные объекты могут размещаться непосредственно в старом поколении). Выживший всегда оставляет область пустой, если определенное количество раз (-XX:MaxTenuringThreshold=nчтобы указать значение по умолчанию 15), объекты, пережившие GC молодого поколения, могут быть повышены до старого поколения.

6.2 Классификация сбора мусора

Когда молодое поколение заполнено, начните выполнять сборку мусора молодого поколения (minor collection). Сборка мусора старого поколения также выполняется при заполнении старого поколения (full GC,major collection), как правило, GC молодого поколения будет выполняться первым, и несколько молодых GC будут запускатьFGC, конечно, это не абсолют, т.к. большие объекты будут напрямую выделяться под старость, а при недостатке выделенной памяти старости это может спровоцировать частыеFGC. В настоящее время кромеCMSвне коллектора, во время выполненияFGCВся куча собирается мусором.

6.3 Последовательный коллектор

С серийным сборщиком молодые и старые сборки мусора выполняются последовательно (в однопроцессорной системе) в режиме остановки мира. То есть приложение должно прекратить работу, пока выполняется работа по сборке мусора.

6.3.1 Сборка мусора молодого поколения с использованием последовательного сборщика

На рис. 3 показано выполнение сборки мусора молодого поколения с использованием последовательного сборщика.Edenа такжеSurvivor FROMОбъекты, выжившие в этой области, будут скопированы в другую область Выжившего (область, отмеченная на рисунке К), которая изначально пуста.Среди них эти объекты слишком велики, чтобыSurvivorОбъекты, которые не помещаются в зону, будут скопированы непосредственно в старое поколение. По отношению к объекту, который был скопирован в область «Кому», исходныйSurvivorСохранившиеся объекты в регионе (область, отмеченная на рисунке From) все еще относительно молоды, в то время как объекты, скопированные в старое поколение, относительно старше.

После того, как сборка мусора молодого поколения будет завершена, область Эдема и область «Откуда» будут опустошены, и только область «Кому» продолжит содержать уцелевшие объекты. В это время области «От» и «Кому» логически меняются местами, область «Кому» становится областью «От», а исходная область «От» становится областью «Кому», как показано на рисунке 4.

6.3.2 Сборка мусора старого поколения с использованием последовательного сборщика

Для серийного сборщика старые и бессмертные поколения используют алгоритм Mark-Sweep-Compact для сборки мусора. На этапе маркировки сборщик определяет, какие объекты активны. Фаза очистки очищает поколения, идентифицируя мусорные объекты. Затем сборщик выполняет скользящее сжатие, перемещая живые объекты в начало пространства памяти старого поколения (то же самое верно и для бессмертного поколения), так что в конце пространства памяти старого поколения создается большое непрерывное пространство. . Как показано на рисунке 5. Эта сортировка может быть выполнена с помощью указателей коллизий.

6.3.3 Когда использовать последовательный сборщик мусора

Большинство приложений, работающих на клиенте, предпочтут использовать параллельный сборщик мусора, потому что эти приложения не предъявляют высоких требований к малому времени паузы. С современным оборудованием последовательный сборщик мусора может эффективно управлять многими важными приложениями с 64-мегабайтной кучей и выполнять полную сборку мусора менее чем за полсекунды.

6.3.4 Выбор последовательного сборщика мусора

В выпуске J2SE 5.0 на машинах, отличных от классов серверов, по умолчанию выбран последовательный сборщик мусора. На других типах машин вы можете явно использовать последовательный сборщик мусора, добавив параметр -XX:+UseSerialGC.

6.4 Параллельный коллектор

В настоящее время многие Java-приложения выполняются на машинах с большой физической памятью и несколькими процессорами. Параллельные сборщики мусора, также известные как сборщики мусора пропускной способности, используются для работы по сбору мусора. Сборщик может в полной мере использовать характеристики нескольких ЦП, чтобы ЦП не выполнял сборку мусора, пока другие ЦП простаивают.

6.4.1 Сборка мусора молодого поколения с использованием параллельного сборщика мусора

Здесь параллельная версия алгоритма последовательной сборки мусора, используемая для параллельной сборки мусора молодого поколения. Он по-прежнему останавливает мир и копирует объекты, но использует несколько ЦП для параллельной сборки мусора, сокращая время, затрачиваемое на сборку мусора, и повышая производительность приложения. На рис. 6 показана разница между последовательным сборщиком мусора и параллельным сборщиком мусора, когда сборщиком мусора занимается молодое поколение.

6.4.2 Сборка мусора старого поколения с использованием параллельного сборщика мусора

Параллельная сборка мусора в старом поколении использует тот же последовательный алгоритм пометки-очистки-уплотнения, что и последовательный сборщик мусора.

6.4.3 Когда использовать параллельный сборщик мусора

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

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

6.4.4 Выбор параллельного сборщика мусора

В выпуске J2SE 5.0, если приложение выполняется на машине серверного класса, по умолчанию используется параллельный сборщик мусора. На других машинах параллельный сборщик мусора можно явно включить с помощью параметра -XX:+UseParallelGC.

6.6 Параллельный уплотняющий коллектор

Сборщик мусора с параллельной очисткой был представлен в обновлении 6 J2SE 5.0. Отличие от сборщика мусора с параллельной очисткой заключается в том, что сборщик мусора с параллельной очисткой использует новый алгоритм для выполнения сборки мусора в старом поколении. Обратите внимание, что в конечном итоге параллельный сборщик мусора заменит параллельный сборщик мусора.

4.6.1 Сборка мусора молодого поколения с помощью параллельного сборщика мусора

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

4.6.2 Сборка мусора старого поколения с использованием сборщика мусора с параллельным сопоставлением

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

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

На этапе сводки обрабатываются регионы, а не отдельные объекты. Левая часть каждого поколения будет иметь более высокую плотность объектов, содержащих большую часть живых объектов, из-за сортировки, выполненной предыдущими сборками мусора. Как только эти области с высокой плотностью объектов восстановлены до пригодного для использования состояния, не стоит тратить время на их сортировку. Итак, первое, что нужно сделать на этапе суммирования, — это проверить плотность живых объектов каждой области, начиная с самого левого объекта, и остановиться до тех пор, пока не будет найден небольшой оверхед, чтобы восстановить свою собственную область и пространство справа от него. Все области слева от найденной области называются плотными префиксами, и в эти области больше не будут перемещаться объекты. Область за этой областью очищается, очищая все мертвое пространство (очищая пространство, занятое мусорными объектами). На этапе суммирования вычисляются и сохраняются новые адреса для объектов в каждой обрезанной области. Обратите внимание, что в текущей реализации стадия суммирования является последовательной, конечно, стадия суммирования может быть реализована и параллельно, но параллелизм стадии суммирования производительности не так важен, как параллелизм стадии тегирования.

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

4.6.3 Когда использовать сборщик мусора с параллельной очисткой

По сравнению с параллельным сборщиком мусора использование параллельного сборщика мусора с очисткой более выгодно для приложений, работающих на нескольких процессорах. Кроме того, параллельная работа сборки мусора старого поколения позволяет сократить время паузы приложения.Для тех приложений, которые предъявляют более высокие требования к времени паузы, параллельная сборка мусора больше подходит, чем параллельная сборка мусора. Параллельные аккуратные сборщики мусора могут не подходить для приложений, которые сосуществуют со многими другими приложениями на одном компьютере, и в этом случае ни одно приложение не может монополизировать весь ЦП. На таких машинах рассмотрите возможность уменьшения количества потоков, выполняющих сборку мусора (используя параметр командной строки -XX:ParallelGCThreads=n), или используйте другой сборщик мусора.

4.6.4 Выбор параметра сборки мусора при параллельной дефрагментации

Если вы хотите использовать сборщик мусора с параллельной сортировкой, вы должны явно указать параметр командной строки -XX:+UseParallelOldGC.

4.7 Параллельный сборщик мусора Mark-Sweep (CMS)

Для многих приложений пропускная способность «точка-точка» не так важна, как быстрое время отклика. Как правило, сборка мусора молодого поколения не вызывает длительных пауз. Однако сборка мусора старого поколения, хотя и нечастая, может вызывать длительные паузы, особенно при использовании больших куч. Чтобы справиться с этой ситуацией, JVM HotSpot использует сборщик мусора CMS, также известный как сборщик мусора с малой задержкой.

4.7.1 Сборка мусора молодого поколения с использованием сборщика мусора CMS

Сборщик мусора CMS собирает только старое поколение, а молодое поколение фактически используется по умолчанию.ParNewGC(параллельный сборщик мусора молодого поколения).

4.7.2 Сборка мусора старого поколения с использованием сборщика мусора CMS

Большинство устаревших способов сбора мусораCMSСборщик мусора, работа по сбору мусора выполняется одновременно с выполнением приложения.

Обработать описывать
начальная отметка Отметьте уцелевшие объекты старого поколения и, возможно, также уцелевшие объекты молодого поколения. Приостановить поток приложенияstop-the world
одновременная маркировка Выполняется вместе с приложением, помечая живые объекты, созданные во время работы приложения.
замечание Отмечать объекты, пропущенные из-за обновлений приложения, приостанавливать поток приложенияstop-the world
Параллельная очистка При очистке непомеченных объектов дефрагментация памяти не выполняется, что может привести к проблемам с фрагментацией памяти.
сброс настроек Очистите данные и дождитесь выполнения следующей коллекции.

На рис. 7 показана разница между сериализованным сборщиком мусора с маркировкой и очисткой и сборщиком мусора CMS для сборки мусора старого поколения.

Отсутствие очистки пространства памяти экономит время, но доступное пространство больше не является непрерывным, и сборщик мусора не может просто использовать указатель, указывающий на следующий адрес, который можно использовать для выделения памяти для объекта. Вместо этого в этом случае необходимо использовать список свободного места. То есть создается список указателей на нераспределенные области, и каждый раз, когда память выделяется для объекта, из списка находит область памяти соответствующего размера для выделения памяти для нового объекта. Результатом этого является то, что выделение памяти в старом поколении обходится дороже, чем простое и практичное выделение указателя коллизии. Это также увеличивает нагрузку на сборку мусора молодого поколения, поскольку большинство объектов старого поколения перемещаются из молодого поколения в старое во время сборки мусора молодого поколения.

Еще одним недостатком использования сборщика мусора CMS является то, что он требует больше места, чем другие сборщики мусора. На этапе маркировки приложение может продолжать работать и может продолжать выделять память, потенциально увеличивая использование памяти в старом поколении. Кроме того, хотя сборщик мусора гарантированно пометит все активные объекты на этапе маркировки, некоторые объекты могут стать мусором на этом этапе, и эти объекты не будут собраны до тех пор, пока не будет выполнена следующая сборка мусора. Эти объекты становятся плавающим мусором.

Наконец, фрагментация памяти происходит из-за того, что не используется сортировка. Чтобы решить эту проблему, сборщик мусора CMS отслеживает размер часто используемых объектов, оценивает возможные потребности в памяти и может различать или объединять блоки памяти для удовлетворения потребностей.

В отличие от других сборщиков мусора, когда заполняется старое поколение, сборщик мусора CMS не собирает мусор старого поколения. Вместо этого он выполняет работу по сбору мусора до заполнения старого поколения. В противном случае это приведет к длительной паузе приложения, как при последовательном или параллельном сборщике мусора. Чтобы избежать этой ситуации, сборщик мусора CMS будет вовремя выполнять работу по сборке мусора на основе статистики, которая охватывает время выполнения предыдущих сборок мусора и скорость выделения новой памяти в старом поколении. Когда уровень занятости памяти в старом поколении превышает пороговое значение, называемое начальной скоростью заполнения, сборщик мусора CMS активируется для сборки мусора. Начальное размещение можно установить с помощью параметров командной строки.-XX:CMSInitiatingOccupancyFraction=nSet, где n — значение процента занятости старого поколения, по умолчанию 68.

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

Семь, коллекционер G1

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

  • Выполнить сборку мусора одновременно
  • Дефрагментация памяти в короткие сроки
  • Время паузы GC можно контролировать
  • Нет необходимости жертвовать пропускной способностью
  • Нет необходимости занимать дополнительное пространство кучи java Что нужно для использования коллектора G1?
  • частые ФСК
  • Темпы распределения объектов или темпы продвижения сильно различаются.
  • Недопустимо длинные паузы GC и время очистки памяти

Сборщик G1 имеет совершенно другую структуру памяти по сравнению с предыдущим сборщиком мусора.Хотя есть логически молодое и старое поколения, физическое пространство не является непрерывным, а хешируется в памяти один за другим.regions. Пространство памяти разделено на множество независимых пространств, которые называются умножением.regions. когдаjvmпри запускеreginsразмер определяется. JVM создаст около 2000 регионов, а размер каждого региона составляет от 1 до 32 МБ. Структура памяти следующая:

7.1 Коллекция молодого поколения с использованием G1

Когда срабатывает GC молодого поколения, уцелевшие объекты в Эдеме будут скопированы или перемещены.evacuatedв зону выживанияregions, уцелевшие объекты, количество уцелевших репликаций которых достигает порогового значения, будут переведены в старую зону. Этот процесс также является паузой Stop-the-world. Размер Эдема и выжившего будет пересчитан перед следующим GC молодого поколения.

В целом, поведение мобильного телефона G1 среди молодого поколения включает в себя следующее:

1. Память разбита на независимые друг от друга области одинакового размера. 2. Молодое поколение хешируется во всем пространстве памяти, преимущество этого в том, что это очень удобно, когда нужно перераспределить размер молодого поколения. 3. стоп-слово приостанавливает все потоки. 4. По сути это тоже параллельный алгоритм восстановления, многопоточный параллельный сбор. 5. Выжившие объекты будут скопированы в новые выжившие или старые регионы.

7.2 Коллекция старого поколения с использованием G1

Обработать описывать
начальная отметка stop-the worldЧасто за ними следуют GC молодого поколения, отмеченные выжившими областями, связанными с объектами старого поколения.
Сканировать корневые регионы Выполнение одновременно с потоками приложения, сканирование выживших областей
одновременная маркировка Одновременно пометить всю кучу для живых объектов
замечание Чтобы завершить маркировку живых объектов всей кучи, используйтеsnapshot-at-the-beginning (SATB)Алгоритм пометки живых объектов, этот алгоритм работает быстрее, чем используемый в CMS.stop-the-word
Параллельная очистка Параллельно очищайте мертвые объекты, возвращая пустые области в список доступных.
копировать копировать уцелевшие объекты в новые регионы,This can be done with young generation regions which are logged as [GC pause (young)]. Or both young and old generation regions which are logged as [GC Pause (mixed)].

Лучшие практики

1. Не указывать численность молодого поколения-Xmn, G1 будет пересчитывать и устанавливать размер молодого поколения после каждой сборки мусора, что повлияет на глобальное время паузы 2. Настройка времени отклика-XX:MaxGCPauseMillis=<N>3. Как решить проблему очистки или копирования сбоя, добавив-XX:G1ReservePercent=nНастройте размер зарезервированного пространства, чтобы предотвратитьEvacuation Failure, значение по умолчанию — 10. Вы также можете использовать-XX:ConcGCThreads=nУвеличьте количество одновременно помеченных потоков для решения

8. Связанные команды

выбрать сборку мусора

-XX:+UseSerialGC            串行垃圾收集器
-XX:+UseParallelGC          并行垃圾收集器
-XX:+UseParallelOldGC       并行整理垃圾收集器
-XX:+UseConcMarkSweepGC	    并发标记清理(CMS)垃圾收集年轻代默认使用-XX:+ParNewGC
-XX:+UserG1GC

Просмотр журналов сборки мусора

-XX:+PrintGC                
-XX:+PrintGCDetails     
-XX:+PrintGCTimeStamps      

Для конфигурации размера:

-Xmsn                           堆最小值
-Xmxn                           堆最大值
-Xmn                            年轻代大小
-XX:NewRatio=n	                年清代比例 Client_JVM=2 Server_JVM=8     
-XX:SurvivorRatio=n	            幸存去比例
-XX:MaxPermSize=n               依赖于不同平台的实现永生代的最大值(java 8 以后启用)。

Доступные конфигурации для G1

-XX:+UseG1GC	Use the Garbage First (G1) Collector
-XX:MaxGCPauseMillis=n	Sets a target for the maximum GC pause time. This is a soft goal, and the JVM will make its best effort to achieve it.
-XX:InitiatingHeapOccupancyPercent=n	Percentage of the (entire) heap occupancy to start a concurrent GC cycle. It is used by GCs that trigger a concurrent GC cycle based on the occupancy of the entire heap, not just one of the generations (e.g., G1). A value of 0 denotes 'do constant GC cycles'. The default value is 45.
-XX:NewRatio=n	Ratio of new/old generation sizes. The default value is 2.
-XX:SurvivorRatio=n	Ratio of eden/survivor space size. The default value is 8.
-XX:MaxTenuringThreshold=n	Maximum value for tenuring threshold. The default value is 15.
-XX:ParallelGCThreads=n	Sets the number of threads used during parallel phases of the garbage collectors. The default value varies with the platform on which the JVM is running.
-XX:ConcGCThreads=n	Number of threads concurrent garbage collectors will use. The default value varies with the platform on which the JVM is running.
-XX:G1ReservePercent=n	Sets the amount of heap that is reserved as a false ceiling to reduce the possibility of promotion failure. The default value is 10.
-XX:G1HeapRegionSize=n

Ссылаться на:

Getting Started with the G1 Garbage Collector

Управление памятью в Java Виртуальная машина HotSpot™