Учитесь вместе, алгоритм сборки мусора G1

задняя часть

Чтобы решить проблему фрагментации пространства и другие проблемы, вызванные алгоритмом CMS, HotSpot предлагает другую стратегию сборки мусора — алгоритм G1 (Garbage First).-XX:+UseG1GCДля включения алгоритм был официально запущен в версии JDK 7u4, официальный сайт описывает его следующим образом:

The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machines with large memories. It meets garbage collection (GC) pause time goals with a high probability, while achieving high throughput. The G1 garbage collector is fully supported in Oracle JDK 7 update 4 and later releases. The G1 collector is designed for applications that:

  • Can operate concurrently with applications threads like the CMS collector.

  • Compact free space without lengthy GC induced pause times.

  • Need more predictable GC pause durations.

  • Do not want to sacrifice a lot of throughput performance.

  • Do not require a much larger Java heap.

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

  • Поток сборки мусора и поток приложения выполняются одновременно, как и в CMS.

  • Избегайте длительных пауз при сжатии свободной памяти

  • Приложениям требуется более предсказуемое время пауз GC

  • Я не хочу слишком сильно жертвовать пропускной способностью

  • Нет необходимости в большой куче Java

структура кучи памяти

1. Предыдущие алгоритмы сборки мусора, такие как CMS, использовали следующую структуру кучи памяти:

  • Новое поколение: райское пространство + 2 выживших

  • Старость: старое пространство

  • Постоянная генерация: до 1,8 промплощадки

  • Метапространство: метапространство после 1.8

Эти пробелы должны быть адресуемыми смежными пробелами.

2. В алгоритме G1 используется совершенно иной способ организации памяти кучи. Память кучи делится на несколько блоков памяти (Регионов) одинакового размера. Каждый Регион представляет собой логически непрерывный участок памяти со следующей структурой:

Каждый регион отмечен буквами E, S, O и H, что указывает на то, что каждый регион играет роль во время выполнения, где H отсутствует в предыдущем алгоритме, он означает Humongous, что означает, что в этих регионах хранятся огромные объекты (огромный объект, H-obj), когда размер вновь созданного объекта превышает половину размера региона, он непосредственно размещается в одном или нескольких новых смежных регионах и помечается как H.

Region

Размер области в куче памяти можно определить по-XX:G1HeapRegionSizeПараметр указывает, что диапазон размеров может быть только 1M, 2M, 4M, 8M, 16M и 32M. Короче говоря, это степень числа 2. Если G1HeapRegionSize является значением по умолчанию, фактический размер области вычисляется, когда куча инициализируется Конкретная реализация выглядит следующим образом:

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

режим ГХ

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

young gc

В алгоритме GC, который происходит в молодом поколении, общие объекты (кроме гигантских объектов) выделяют память в регионе eden.Когда все регионы eden исчерпаны и не могут претендовать на память, будет запущен молодой gc.Этот механизм запуска То же, что и предыдущий.Молодая сборка мусора почти такая же.После однократного выполнения молодой сборки активные объекты будут скопированы в выживший регион или перемещены в старый регион, а неиспользуемые регионы будут помещены в список свободных, ожидающих использования в следующий раз .

| Параметр | Значение | | :-: | --- | | -XX:MaxGCPauseMillis | Установить целевое время процесса сбора G1, значение по умолчанию 200 мс | | -XX:G1NewSizePercent | Минимальное значение нового поколения, значение по умолчанию |значение 5%||-XX :G1MaxNewSizePercent|Максимальное значение нового поколения, значение по умолчанию 60% |

mixed gc

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

Итак, когда срабатывает смешанный gc?

Сначала просмотрите механизм срабатывания cms, если добавлены следующие параметры:

  1. -XX:CMSInitiatingOccupancyFraction=80

  2. -XX:+UseCMSInitiatingOccupancyOnly

скопировать код

Когда уровень использования старого возраста достигает 80%, будет запущена cms gc.

Напротив, в смешанном gc также имеется пороговый параметр.-XX:InitiatingHeapOccupancyPercent, когда процентное соотношение размера старой генерации ко всему размеру кучи достигает этого порога, будет запущен смешанный сборщик мусора.

Процесс выполнения Mixed GC немного похож на CMS, в основном разделенный на следующие этапы:

  1. начальная метка: процесс начальной метки, весь процесс STW, помечает объекты, доступные из корня GC.

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

  3. примечание: окончательный процесс маркировки, весь процесс STW, помечает те объекты, которые пропущены в параллельном процессе маркировки или чьи внутренние ссылки изменились

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

full gc

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


Если вы чувствуете себя вознагражденным после прочтения, пожалуйста, поставьте лайк, подпишитесь и добавьте официальную учетную запись [Ingenuity Zero], чтобы узнать больше захватывающей истории! ! !