Сборщик мусора G1 в Java 9

Интересно, а это нормально, когда ты
во время утренней воскресной прогулки
заходишь на работу, включаешь компьютер
и начинаешь писать статью в личный блог
про сборщик мусора в Java?

В Java 8 сборщиком мусора по умолчанию был Parallel GC, в Java 9  это изменилось. Ему на смену пришёл G1 Garbage Collector,  который обеспечивает минимальное время stop-the-world (время когда сборщик мусора останавливает работу приложения).

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

В Java 9 сборщик мусора G1 используется по умолчанию, но вы также можете явно включить с помощью опции -XX:+UseG1GC.

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

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

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

Garbage-First collector — это НЕ сборщик мусора реального  времени. Он пытается достичь заданного времени по stop-the-world, но это время не выдерживается для конкретной одной остановки приложения.

Сборщик G1 разбивает кучу на регионы одинакового размера. Каждый регион может быть либо свободен, либо содержать объекты из молодого поколения, либо содержать объекты из старого поколения. Регионов достаточно много, может быть множество регионов с молодым поколением и множество регионов со старым поколением. Регионы с молодым поколением делятся на Eden и Survivor. Они осуществляют точно такую же функцию, как и в сборщике мусора Serial GC.

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

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

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

  1. Сборка только в молодом поколении (Young-only phase): Этот этап перетаскивает объекты из регионов с молодым поколением в регионы со старым поколением.  Переход между сборкой только в молодом поколении и этапом освобождения памяти происходит в момент достижения определённого порога заполнения кучи, в который G1 стартует процесс пометки только молодого поколения:
    Начальная пометка (Initial Mark): Помечаются достижимые (живые) объекты в регионах со старым поколением. Этот процесс выполняется БЕЗ stop-the-world. Во время этого процесса также могут происходить сборки только в молодом поколении. После процесса начальной пометки выполняются два этапа с полной остановкой приложения (stop-the-world)..
    Повторная пометка (Remark): Завершает пометку, осуществляет выгрузку классов и глобальную обработку ссылок. Между повторной пометкой и очисткой сборщик мусора вычисляет общую информацию о живых объектах конкурентно (параллельно с работой приложения), которые будут освобождены, эта информация будет использоваться на этапе чистки.
    Чистка (Cleanup): очищает полностью пустые регионы, определяет нужен ли этап освобождения места.
  2. Освобождение места (Space-reclamation phase): Этот этап состоит из из сборки мусора, которая в дополнение к молодым регионам также перемещает живые объекты из множества старых регионов. Этап заканчивается, когда G1 решает, что дальнейшее перемещение ркегионыов не приведёт к освобожждению достаточного места, чтобы этим заниматься.

Немного о внутренностях G1 collector

The Initial Heap Occupancy Percent (IHOP) — это порог, после которого запускается начальная пометка. По умолчанию он определяется автоматически на основе времени, который требуется на пометку.

Для пометки G1 использует алгоритм, называемый Snapshot-At-The-Beginning (SATB).  Он делает виртуальный снапшот кучи в момент начала этапа начальной пометки, то есть считает, что все объекты, которые были живы на момент начала пометки, живы до самого конца процесса начальной пометки (Initial Mark).

Очень большие объекты располагаются в нескольких последовательных регионах старого поколоения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *