【Перевод】Углубленное понимание журнала сборщика мусора G1 (1)

Java JVM

Эта статья переведена с:Woohoo.RedHat.com/en/blog/col…

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

  1. Основные параметры- Для использования коллектора G1 в производстве необходимо использовать эти параметры
  2. Расширенные параметры- По мере увеличения приложения или бизнес-нагрузка увеличивается, эти параметры необходимо настроить для определенных вопросов.
  3. Параметр отладки- Эти параметры используются для решения конкретных проблем с производительностью.Если проблему невозможно воспроизвести в непроизводственной среде, эти параметры будут использоваться для устранения проблемы в производственной среде.

Основные параметры

Если вы собираетесь использовать G1 GC в производственной среде, необходимы следующие параметры, связанные с журналом. С этими параметрами вы можете устранить неисправность проблем сбора мусора.

G1 GC的基础参数

использовать-XX:GCLogFileSizeЧтобы установить соответствующий размер файла журнала GC, используйте-XX:NumberOfGCLogFilesЧтобы задать количество сохраняемых файлов журнала GC, используйте-Xloggc:/path/to/gc.logЗадайте местоположение файла журнала GC и используйте три вышеуказанных параметра, чтобы сохранить информацию журнала GC приложения во время выполнения процесса.Я рекомендую хранить журнал GC не менее одной недели, чтобы у приложения было достаточно информации о времени выполнения для облегчить устранение неполадок.

Кайнозойская коллекция

Как и другие сборщики мусора, G1 использует-XX:PrintGCDetailsРаспечатайте подробный лог сборки мусора.На следующей картинке стандартный процесс сборки нового поколения.Здесь я разделил его на 6 шагов:

G1的新生代垃圾收集

  1. Четыре ключевых сообщения
    • Когда происходит сборка мусора нового поколения -2016-12-12T10:40:18.811-0500, установив-XX:+PrintGCDateStampsНа этот раз параметр можно распечатать;
    • Относительное время после запуска JVM —25.959
    • Тип этой коллекции - коллекция нового поколения, переработан только раздел Eden
    • Время, проведенное в этой коллекции—0,0305171 с или 30 мс
  2. Перечисляет подробный процесс параллельного сбора в коллекции молодого поколения.
    • Parallel Time: Время STW (Stop The World), вызванное задачей параллельной сборки во время запущенного процесса, от начала сборки мусора нового поколения до конца последней задачи, занимает в общей сложности 26,6 мс.
    • GC Workers: За сборку мусора отвечает 4 потока, через параметр-XX:ParallelGCThreadsНастройка, установленное значение этого параметра, связанное с ЦП, физический ЦП, если количество поддерживаемых потоков меньше 8, до 8; если количество потоков, поддерживаемых физическим ЦП, чем 8, число по умолчанию * 5 /8
    • GC Worker Start: прошедшее время (минуты) после запуска JVM, когда начинает работать первый поток сборки мусора; прошедшее время (макс.) после запуска JVM, когда начинает работать последний поток сборки мусора; diff представляет собой разницу между min и max. В идеале вы хотите, чтобы они запускались примерно в одно и то же время, то есть разница приближалась к 0.
    • Ext Root Scanning: время, потраченное на сканирование корневого набора (стек потоков, JNI, глобальные переменные, системные таблицы и т. д.), сканирование корневого набора является отправной точкой сборки мусора, пытаясь найти, указывают ли какие-либо узлы в корневом наборе на текущий набор сбора (CSet)
    • Update RS(Remembered Set or RSet): Каждый раздел имеет свой собственный RSet, который используется для записи указателей других разделов на текущий раздел.Если RSet обновляется, в G1 будет барьер после записи для управления ссылками между разделами - новая ссылочная карта будет Пометить его как грязный и поместить в буфер журнала. Если буфер журнала заполнен, он будет добавлен в глобальный буфер. Во время работы JVM есть потоки, одновременно обрабатывающие грязную карту глобального буфера журнала. .Update RSУказывает, что потоку сборки мусора разрешено обрабатывать буферы журналов, которые не были обработаны до начала этой сборки мусора, что гарантирует актуальность набора RSet текущего раздела.
      • Processed BuffersЭто означает, сколько буферов журналов обрабатывается в процессе UPDATE RS.
    • Scan RS: Сканирование раздела каждого нового поколения, выясните, сколько точек ссылки на текущий раздел CSET.
    • Code Root Scanning: время, потраченное на сканирование корневого узла (локальной переменной) в коде.
    • Object Copy: Во время паузы эвакуации все разделы в CSet должны быть перемещены и эвакуированы, а Object Copy отвечает за копирование объектов, оставшихся в текущем разделе, в новый раздел.
    • Termination: Когда поток сборки мусора завершает свою задачу, он входит в критическую секцию и пытается помочь другим потокам мусора выполнить свои задачи (украсть невыполненные задачи), min указывает, когда поток сборки мусора пытается завершиться, а max указывает поток очистки сборки мусора. , Когда это действительно прекращено.
      • Termination Attempts: если поток сборки мусора успешно крадет задачи из других потоков, он снова крадет больше задач или снова пытается завершиться, и это значение будет увеличиваться каждый раз, когда он завершается.
    • GC Worker Other: время, когда поток сборки мусора выполняет другие задачи.
    • GC Worker Total: Отображение минимального, максимального, среднего, разницы и общего количества текущего времени в каждой резьбе сбора мусора.
    • GC Worker End: min Указывает время после начала JVM, когда заканчивается самая ранняя резьба сбора мусора; MAX указывает на то время после того, как JVM запускается, когда заканчивается новейшая резьба для мусора. В идеале вы хотите, чтобы они закончились быстро и предпочтительно одновременно.
  3. Перечислены некоторые задачи в GC молодого поколения:
    • Code Root Fixup: структура данных освобождения, используемая для управления параллельной сборкой мусора, должна быть близка к 0, этот шаг выполняется линейно;
    • Code Root Purge: Очистить больше структур данных, это должно быть быстро, трудоемкость близка к 0, а также выполняется линейно.
    • Clear CT: очистить карточный стол
  4. Содержит некоторые расширенные функции
    • Choose CSet: Выберите, чтобы быть помещенным в раздел восстановления CSET (стандартный выбор G1 зависит от приоритета районного мусора, который является самым низким уровнем приоритета целевого раздела выживания)
    • Ref Proc: обрабатывает все виды ссылок в Java — мягкие, слабые, окончательные, фантомные, JNI и т. д.
    • Ref Enq: просмотрите все ссылки и поместите те, которые не могут быть переработаны, в список ожидающих обработки.
    • Redirty Card: Карты, измененные во время переработки, будут сброшены как грязные.
    • Humongous Register: JDK8u60 предоставляет функцию, позволяющую перерабатывать гигантские объекты при сборе молодого поколения — черезG1ReclaimDeadHumongousObjectsAtYoungGCустановлено, по умолчанию установлено значение true.
    • Humongous Reclaim: время для выполнения следующих задач: убедитесь, что объект-гигант может быть восстановлен, освободите раздел, занятый объектом-гигантом, сбросьте тип раздела, верните раздел в список свободных и обновите размер свободного пространства.
    • Free CSet: вернуть освобождаемый раздел обратно в список свободных.
  5. Он показывает изменение размера разных поколений и адаптивную настройку размера кучи.
    • Eden:1097.0M(1097.0M)->0.0B(967.0M): (1) Причина, по которой запускается текущая коллекция нового поколения, заключается в том, что пространство Eden заполнено, выделено 1097 МБ и используется 1097 МБ; (2) Все разделы Eden были освобождены, и после окончания нового поколения используемый размер раздела Eden становится 0.0B; (3) Размер раздела Eden уменьшен до 967.0M
    • Survivors:13.0M->139.0M: Из-за переработки раздела молодого поколения пространство выжившего увеличилось с 13,0 МБ до 139,0 МБ;
    • Heap:1694.4M(2048.0M)->736.3M(2048.0M): (1) В начале этой сборки мусора общее использование пространства кучи составляет 1694,4 МБ, а максимальное пространство кучи — 2048 МБ; (2) После этой сборки мусора использование пространства кучи составляет 763,4 МБ, максимальное значение остается неизменным. .
  6. Пункт 6 показывает время сборки мусора нового поколения.
    • user=0.8: время ЦП, потребляемое потоками сборки мусора в процессе сборки мусора нового поколения. Это время связано с количеством потоков сборки мусора и может быть намного больше, чем реальное время;
    • sys=0.0: процессорное время, потребляемое потоком режима ядра. -real=0.03: Эта сборка мусора действительно потребляется;

одновременная сборка мусора

Второе действие G1 по сбору — это параллельная сборка мусора. Существует много условий срабатывания для параллельной сборки мусора, но работа та же самая. Его журнал показан на следующем рисунке:

G1收集器的并发垃圾收集日志

  1. Отмечает начало фазы параллельной сборки мусора:

    • GC pause(G1 Evacuation Pause)(young)(initial-mark): чтобы в полной мере использовать возможности STW для отслеживания всех доступных (живых) объектов, фаза начальной маркировки существует как часть сборки мусора молодого поколения (автостопом). Начальная метка устанавливает две переменные TAMS (top-at-mark-start), чтобы различать живые объекты и вновь выделенные объекты во время фазы параллельной маркировки. Все объекты до TAMS считаются живыми в текущем цикле.
  2. Указывает, что первое, что делается на этапе параллельной маркировки: сканирование корневого раздела

    • GC concurrent-root-region-scan-start: Начните сканирование корневого раздела, сканирование корневого раздела Основное сканирование является новым выжившим районом, найдите объект этой точки субрегиона, чтобы обратиться к текущему разделу, если он будет иметь ссылку, чтобы быть записанным;
    • GC concurrent-root-region-scan-end: Сканирование корневого раздела завершилось, оно заняло 0,0030613 с.
  3. Указывает на параллельную фазу маркировки

    • GC Concurrent-mark-start: Начинается фаза одновременной маркировки. (1) Потоки в параллельной фазе маркировки выполняются вместе с потоками приложения и не имеют STW, поэтому они называются параллельными; потоки сборки мусора в параллельной фазе маркировки, значение по умолчанию — 25% от числа параллельных потоков. , и это значение также может быть параметризовано-XX:ConcGCThreadsУстановить; (2) проследить всю кучу и использовать растровые изображения, чтобы пометить все выжившие объекты, поскольку объекты до вершины TAMS неявно живы, поэтому здесь нужно пометить только те, что после вершины TAMS и до порога; (3) записать изменения в фазе параллельной маркировки.G1 использует алгоритм SATB, который требует снимок кучи в начале сборки мусора.Этот снимок неизменен в процессе сборки мусора,но на самом деле должны быть какие-то объекты.Ссылка будет меняться. В это время G1 использует барьер предварительной записи для записи этого изменения и сохраняет запись в буфере SATB.Если буфер заполнен, он будет добавлен в глобальный буфер, и в то же время у G1 есть поток для обрабатывать этот глобальный буфер параллельно; (4) в процессе параллельной маркировки будет фиксироваться отношение уцелевших объектов каждого раздела к размеру всего раздела;
    • GC Concurrent-mark-end: Фаза параллельной маркировки завершена, она заняла 0,3055438 с.
  4. Перемаркируйте сцену, это остановит мир

    • Finalize Marking: обработка объекта Finalizer в списке Finalizer, занимающая 0,0014099 с;
    • GC ref-proc: эталонная (мягкая, слабая, окончательная, фантомная, JNI и т. д.) обработка занимает 0,0000480 с;
    • Unloading: Разгрузка класса, это занимает 0,0025840с;
    • Помимо перед этими вещами, наиболее важным результатом этого этапа являются: для рассмотрения окончательного появления текущего цикла одновременной всей кучи, оставшийся буфер SATB будет обрабатываться здесь, будут отмечены все живые объекты;
  5. На этапе очистки он также остановит мир.

    • Вычислите последний уцелевший объект: отметьте объекты, выделенные после фазы начальной маркировки, отметьте разделы хотя бы с одним уцелевшим объектом;
    • При подготовке к следующему этапу одновременной маркировки предыдущее и следующее растровые изображения очищаются;
    • Разделы старого поколения и разделы гигантских объектов без живых объектов освобождаются и очищены;
    • Обрабатывать RSET для разделов, которые не имеют никаких живых объектов;
    • Все старые разделы будут отсортированы в соответствии с их собственным коэффициентом выживаемости (доля выживших объектов к размеру всего раздела), чтобы подготовиться к последующему процессу выбора CSet;
  6. Параллельная фаза очистки

    • GC concurrent-cleanup-start: начинается фаза параллельной очистки. Завершите оставшуюся работу по очистке на шаге 5, добавьте полностью очищенный раздел во вторичный список свободных мест и дождитесь получения окончательного списка свободных мест;
    • GC concurrent-cleanup-end: Фаза параллельной очистки завершена, она заняла 0,0012954 с.

смешанная коллекция

В конце фазы параллельного сбора вы увидите журнал фазы смешанного сбора, как показано на следующем рисунке, большая часть журнала такая же, как у сбора молодого поколения, обсуждавшегося ранее, отличается только часть 1:GC pause(G1 Evacuation Pause)(mixed),0.0129474s, эта строка указывает, что это цикл смешанной сборки мусора; CSet, обрабатываемый в смешанной сборке мусора, включает не только разделы молодого поколения, но и разделы старого поколения, то есть разделы старого поколения, отмеченные на этапе параллельной маркировки.

G1的混合收集

Full GC

Если места в куче памяти недостаточно для размещения новых объектов или использование пространства Metasapce достигает установленного порога, то будет запущен полный сборщик мусора — этого следует избегать при использовании G1, потому что полный сборщик мусора G1 Gc является единичным. с резьбой, остановит мир, а стоимость очень высока. Журнал Full GC показан на рисунке ниже, из которого можно увидеть три вида информации

  1. На этом рисунке причиной полного GC является сбой распределения, а другой распространенной причиной является пороговое значение GC метаданных;
  2. Частота проведения полной сборки сборов: допустимо проводить полную сборку каждые несколько дней, но недопустимо проводить полную сборку каждые 1 час;
  3. Время, затрачиваемое на полный сборщик мусора, полный сборщик мусора на этом изображении занимает 150 мс (PS: по моему опыту, если полный сборщик мусора происходит в реальной работе, время будет намного больше, чем это)

G1的Full GC

Среди основных параметров конфигурации я хотел бы представить здесь еще два:-XX:+PrintGCApplicationStoppedTimeи-XX:+PrintGCApplicationConcurrentTime, эти два параметра также могут дать вам полезную информацию, как показано на следующем рисунке:

其他信息

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

Суммировать

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

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

javaadu