Full GC
Полный сборщик мусора — это сбор всей кучи, включая новое поколение, старое поколение, постоянное поколение (в JDK 1.8 и более поздних версиях постоянное поколение будет удалено и заменено метапространством) и другие режимы для сбора всех частей
RednaxelaFX БольшойсуществуетВ чем разница между Major GC и Full GC? А как насчет триггерных условий? - Знаю почтиНа этот вопрос есть ответы о классификации GC:
Для реализации HotSpot VM в ней фактически есть две точные классификации GC:
-
Частичный GC: режим, который не собирает всю кучу GC
- Young GC: собирайте только GC молодого поколения,У Young GC также есть поговорка под названием «Minor GC».
- Старый GC: собирайте только GC старого поколения. В этом режиме работает только одновременная сборка CMS сборщика мусора.
- Смешанный GC: собирает GC всего молодого поколения и части старого поколения. Этот режим есть только у сборщика мусора G1
- Full GC: собрать всю кучу, включая новое поколение, старое поколение, постоянное поколение (в JDK 1.8 и более поздних версиях постоянное поколение удалено и заменено метапространством) и другие части шаблона.
Условия срабатывания полного GC
Для разных сборщиков мусора условия срабатывания Full GC могут быть разными.По реализации серийного GC HotSpot VM, условие триггера:
-
При подготовке к запуску молодого GC, если статистика говорит, что средний размер продвижения предыдущего молодого GC больше, чем текущее оставшееся пространство старого поколения, молодой GC не будет запущен, но будет запущен полный GC.(Потому что в сборщике мусора HotSpot VM помимо параллельной сборки сборщика мусора CMS, другие сборщики мусора, которые могут собирать old gen, будут одновременно собирать всю кучу GC, включая young gen, так что нет необходимости готовить отдельный молодой GC заранее)
-
Если есть постоянное поколение (perm gen), когда место выделено в постоянном поколении, но места недостаточно, также должен быть запущен полный GC
-
System.gc(), дамп кучи с GC, по умолчанию запускает полный GC.
Условия срабатывания других неконкурентных GC в HotSpot VM более сложны, но общий принцип такой же, как и выше.
иВ сборщике Parallel Scavenge по умолчанию выполняется молодой GC перед запуском полного GC., и приложение может немного работать между двумя сборщиками мусора, чтобы сократить время паузы полного сборщика мусора (поскольку молодой сборщик мусора будет пытаться очистить мертвые объекты молодого поколения, уменьшая нагрузку на полный сборщик мусора).Параметр виртуальной машины, управляющий этим поведением: -XX:+ScavengeBeforeFullGC.
Условия срабатывания параллельного GC отличаются.Взяв в качестве примера CMS GC, он в основном регулярно проверяет использование старого поколения, но если использование превышает коэффициент срабатывания, CMS GC будет запущен один раз, и старый поколение будет собираться одновременно..
Minor GC
Малый GC широко известен как,Сборка мусора нового поколения (новое поколение разделено на одну область Eden и две области Survivor) называется Minor GC. От старшего научного сотрудника Oracle Чжэн Юди.Колонка Geek Time "Углубленный разбор виртуальной машины Java"также говорили оMinor GC, содержание следующее:
Условия срабатывания
Что делать, если закончилось место в районе Эдема? В это время виртуальная машина Java запустится один раз.Minor GCДля сбора мусора нового поколения уцелевшие предметы будут отправлены в Зону Выживших.
Проще говоря, Minor GC срабатывает, когда область Эдема нового поколения заполнена.
Незначительный процесс сборки мусора
Как упоминалось ранее,В новом поколении есть две области Survivor, мы ссылаемся на from и to соответственно.. Область выживших, на которую указывает to, пуста.
Когда происходит Minor GC, уцелевшие объекты в области Eden и области Survivor, на которые указывает from, будут скопированы (используя здесь алгоритм метки-копии) в область Survivor, на которую указывает to, а затемПоменяйте местами указатели from и to, чтобы убедиться, что область Survivor, на которую указывает to, по-прежнему пуста в следующем Minor GC..
Примечание: from и to — это всего лишь два указателя, они меняются, область Survivor, на которую указывает указатель to, пуста.
Условия повышения предметов в области Выживших до предметов в старости
Виртуальная машина Java записывает, что объекты в области Survivor копируются туда и обратно несколько раз.Если количество копий объекта равно 15 (соответствует параметру виртуальной машины -XX:+MaxTenuringThreshold), то объект будет повышен до старости., (Что касается того, почему это 15 раз, причина в том, что HotSpot будет записывать возраст в поле тега в заголовке объекта, а выделенное пространство составляет всего 4 бита, поэтому он может записывать только до 15). Кроме того,Если одна область Survivor была занята на 50% (соответствует параметру виртуальной машины: -XX:TargetSurvivorRatio), то объекты с более высоким временем репликации также будут переведены в старое поколение.
Когда некоторые объекты в области Survivor повышаются до старого поколения, заполняемость старого поколения обычно увеличивается.
Уведомление:
Во время процесса Minor GC Survivor может не хватить для размещения уцелевших объектов в Эдеме и другого Survivor. Если живые объекты в Survivor переполнятся, лишние объекты будут перемещены в старое поколение, что называетсяПреждевременное продвижение, что может привести к росту короткоживущих объектов в старом поколении, что может вызвать серьезные проблемы с производительностью. Идя дальше, в процессе Minor GC, если старая эра заполнена и не может вместить больше объектов, за Minor GC обычно следует Full GC, что приводит к обходу всей кучи Java, которая называетсяОшибка продвижения. Что касается решения, то это настройка приложения, которая здесь описываться не будет.Если вам интересно, пожалуйста, ознакомьтесь с соответствующей информацией самостоятельно.
Незначительные проблемы GC и анализ карточной таблицы
Проблема с Minor GC заключается в том, что объекты в старом поколении могут ссылаться на объекты в молодом поколении., при маркировке уцелевших объектов необходимо сканировать объекты старого поколения.Если в объекте есть ссылка на объект нового поколения, то эта ссылка также будет использоваться как GC Roots. Это эквивалентно выполнениюполное сканирование кучи.
Как JVM избегает сканирования Minor GC всей кучи
Решение, данное HotSpot, представляет собой программу под названиемкарточный столТехнологии. Как показано ниже:
Конкретная стратегия карточного столаРазделить пространство старости на несколько карт размером 512Б, и вести таблицу карт.Сама таблица карт представляет собой байтовый массив.Каждый элемент в массиве соответствует карте,которая на самом деле является идентификационным битом.Эта идентификация бит представляет, может ли соответствующая карта иметь ссылку на объект нового поколения, если возможно, то считаем карту грязной, т.е.грязная карта. Как показано на изображении выше, таблица карт 3 помечена как грязная.
При выполнении Minor GC вместо сканирования всего старого поколения мы можем искать грязные карты в таблице карт, а в GC Roots of the Minor GC добавить ссылку старого поколения в грязной карте на молодое поколение. все грязные карты сканируются, виртуальная машина Java сбрасывает флаги всех грязных карт. Таким образом, виртуальная машина обменивает пространство на время, избегая полного сканирования таблицы.
Примечания к основному GC
В дополнение к Full GC и Minor GC также существует термин «Major GC»:
Major GC обычно эквивалентен полному GC, собирая всю кучу GC, но из-за разработки HotSpot VM в течение стольких лет интерпретация различных терминов была полностью запутана внешним миром.Когда кто-то говорит «Major GC», не забудьте четко спросить, хочет ли он сослаться на полный GC выше или на старый GC
Выше это то, что R University сказал о Major GC, который является более авторитетным. популярный онлайнДругой способ сказать, что Major GC — это сборщик мусора для старого поколения.
резюме
Вышеупомянутое содержание в основном из ответа знаний R иКолонка Geek Time "Углубленный разбор виртуальной машины Java"В заключение, в процессе подведения итогов можно считать наличие базового понимания Full GC и Minor GC.
Возьми из сети и отдай обратно в сеть.Я отморозок игрок на JVM.Если есть ошибки,посоветуйте
Ссылки и благодарности
- В чем разница между Major GC и Full GC? А как насчет триггерных условий? - Зная - ответ RednaxelaFX
- Колонка Geek Time "Углубленный разбор виртуальной машины Java"
- Разговор об оптимизации GC Java-приложений из практических примеров — техническая команда Meituan
- Перевод — второстепенный GC против основного GC против полного GC