Сборщик мусора Garbage-First (G1) в Java VM

Сборщик мусора Garbage-First (G1) предназначен для многопроцессорных машин с большим объемом памяти. Он с высокой вероятностью пытается достичь целей времени паузы при сборке мусора, одновременно обеспечивая высокую пропускную способность и не требуя настройки. G1 стремится обеспечить лучший баланс между задержкой и пропускной способностью, используя текущие целевые приложения и среды, функции которых включают:

  • Размеры кучи составляют до десятков ГБ или более, причем более 50% кучи Java занято живыми данными.
  • Темпы размещения объектов и продвижения, которые могут значительно меняться со временем.
  • Значительное количество фрагментации в куче.
  • Предсказуемые целевые значения времени паузы, которые не длиннее нескольких сотен миллисекунд, избегая длительных пауз сборки мусора.

G1 заменяет коллектор Concurrent Mark-Sweep (CMS). Это также сборщик по умолчанию.

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

Включение G1

Сборщик мусора Garbage-First является сборщиком по умолчанию, поэтому обычно вам не нужно выполнять никаких дополнительных действий. Вы можете явно включить его, указав -XX:+UseG1GC в командной строке.

Основные понятия

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

Некоторые операции всегда выполняются в паузах stop-the-world для повышения пропускной способности. Другие операции, которые занимают больше времени при остановке приложения, такие как операции с целой кучей, такие как глобальная маркировка, выполняются параллельно и конкурентно с приложением. Чтобы сделать короткие паузы stop-the-world короткими для регенерации пространства, G1 выполняет регенерацию пространства поэтапно, поэтапно и параллельно. G1 достигает предсказуемости, отслеживая информацию о предыдущем поведении приложения и паузах сбора мусора, чтобы построить модель связанных затрат. Он использует эту информацию для оценки работы, выполненной в паузах. Например, G1 сначала освобождает пространство в наиболее эффективных областях (то есть областях, которые в основном заполнены мусором, поэтому и называется Garbage-First (дословно Мусор-Первый) - из-за первоочередной работы с простраствами заполненными мусором).

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

Сборщик Garbage-First - это не сборщик в реальном времени. Он пытается достичь поставленных целей времени паузы с высокой вероятностью в течение более длительного времени, но не всегда с абсолютной уверенностью для данной паузы.

Разметка кучи

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

Молодое поколение содержит районы eden (красный) и районы выживших (survivor) (красный с "S"). Эти области обеспечивают ту же функцию, что и соответствующие смежные пространства в других коллекторах, с той разницей, что в G1 эти области обычно располагаются в виде непрерывного шаблона в памяти. Старые регионы (светло-голубые) составляют старое поколение. Области старого поколения могут быть огромными (светло-голубой с буквой "H") для объектов, которые охватывают несколько областей.

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

Цикл сбора мусора

На верхнем уровне коллектор G1 чередуется между двумя фазами. Фаза "только для молодых" содержит сборки мусора, которые постепенно заполняют доступную в настоящее время память объектами старого поколения. На этапе освоения пространства G1 постепенно восстанавливает пространство в старом поколении, в дополнение к работе с молодым поколением. Затем цикл возобновляется с фазы "только для молодых".

В следующем списке подробно описаны фазы, их паузы и переход между фазами цикла сборки мусора G1:

  1. Фаза "только для молодых": эта фаза начинается с нескольких обычных сборок молодых объектов, которые продвигают объекты в старое поколение. Переход между фазой "только для молодых" и фазой освоения пространства начинается, когда занятость старого поколения достигает определенного порогового значения, порогового значения Initiating Heap Occupancy. В это время G1 планирует Конкурентное начало молодой сборки вместо обычной молодой сборки.
    • Конкурентное начало (Concurrent Start): этот тип сборки запускает процесс маркировки в дополнение к выполнению обычной молодой сборки. Одновременная маркировка определяет все доступные в настоящее время (живые) объекты в регионах старого поколения, которые будут сохранены для следующей фазы освоения пространства. Хотя маркировка сборки еще не закончена, могут появиться обычные молодые сборки. Маркировка заканчивается двумя специальными паузами stop-the-world: Remark и Cleanup.
    • Примечание (Remark). Эта пауза завершает саму маркировку, выполняет глобальную обработку ссылок и выгрузку классов, восстанавливает полностью пустые области и очищает внутренние структуры данных. Между Remark и Cleanup G1 вычисляет информацию, чтобы впоследствии иметь возможность конкурентно освободить свободное место в выбранных областях старого поколения, что будет завершено в паузе Cleanup.
    • Очистка (Cleanup): эта пауза определяет, будет ли на самом деле фаза восстановления пространства. Если наступает этап освоения пространства, этап "только для молодых" завершается одной сборкой Prepare Mixed young.
  2. Этап восстановления пространства. Этот этап состоит из нескольких смешанных сборок, которые в дополнение к регионам молодого поколения также эвакуируют живые объекты из наборов областей старого поколения. Фаза восстановления пространства заканчивается, когда G1 определяет, что эвакуация большего количества областей старого поколения не даст достаточно свободного места, чтобы стоить усилий.

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

Паузы для сбора мусора и набор для сбора

G1 выполняет сборку мусора и восстановление пространства в паузах stop-the-world. Живые объекты обычно копируются из исходных областей в одну или несколько областей назначения в куче, и существующие ссылки на эти перемещенные объекты корректируются.

Для не-огромных (non-humongous) областей область назначения для объекта определяется из исходной области этого объекта:

  • Объекты молодого поколения (районы eden и survivor) копируются в survivor или старые регионы, в зависимости от их возраста.
  • Объекты из старых регионов копируются в другие старые регионы.
  • Объекты в огромных регионах обрабатываются по-разному. G1 только определяет их жизнеспособность, и, если они не живы, восстанавливает пространство, которое они занимают. Объекты в пределах огромных областей никогда не перемещаются G1.

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

  • На этапе "только для молодых" набор сбора состоит только из областей молодого поколения и огромных областей с объектами, которые потенциально могут быть восстановлены.
  • На этапе "Восстановление пространства" набор сбора состоит из областей молодого поколения, огромных областей с объектами, которые потенциально могут быть восстановлены, и некоторых областей старого поколения из набора областей-кандидатов набора сбора.

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


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки