Как работает сборщик мусора? - PullRequest
41 голосов
/ 21 мая 2010

Может кто-нибудь объяснить, пожалуйста, как работает сборщик мусора G1? Я нигде не смог найти ни одного исчерпывающего и понятного описания.

Спасибо

Ответы [ 3 ]

41 голосов
/ 21 мая 2010

Сборщик разбивает кучу на области фиксированного размера и отслеживает текущие данные в этих регионах.Он сохраняет набор указателей - «запомненный набор» - в и из региона.Когда GC считается необходимым, он сначала собирает регионы с меньшим количеством живых данных (следовательно, «мусор первым»).Зачастую это может означать сбор всей области за один шаг: если количество указателей на область равно нулю, тогда не нужно делать отметку или развертку этой области.

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

30 голосов
/ 10 октября 2013

G1 хорошо объясняется также в этом новом сеансе JavaOne 2012: Настройка производительности сборщика мусора G1 [ youtube ], [ PDF ].

Они начинают с введения CMS и G1, их сравнения, а затем объясняются анализ и настройка G1.

G1 характеристики

  • Области фиксированного размера - куча разделена на области (1 МБ - 32 МБ, ~ 2000, определяется виртуальной машиной).
  • Eden, оставшийся в живых и OldGen, представленный как логический набор областей .
  • Живые объекты эвакуированы из одного региона в другой

Типичная куча G1 может выглядеть так:

A typical G1 heap may look like:

Вот сводка каждой фазы G1:

1. Молодая коллекция

1.1 Молодая фаза - Незначительный GC

  • Эвакуация - Параллельный второстепенный ГК Stop-The-World, в котором живые объекты эвакуируются из Молодого поколения либо в регионы выживших (владение) или в районы Старого поколения (повышение).
  • Бухгалтерия - размер пространства eden / Survivor для следующего молодого GC определяется на основе статистики по каждому региону и на основе времени паузы, установленного приложением. G1 оценивает, сколько времени потребуется для следующего YoungGC.
  • Изменение размера - G1 теперь может легко уменьшать / изменять размеры областей рендеринга / выживания.

1,2 Янг / Начальная отметка

  • GC young initial-mark - начальная фаза маркировки для коллекции OldGen, которая выполняется параллельно с коллекцией YoungGC. Начальная отметка - это параллельный параллельный процесс маркировки.

2. Коллекция Old Gen

2,1 Начальная отметка - см. 1.2. * * 1068

2.2 GC примечание

  • одна пауза "остановка мира", одновременная маркировка живых объектов
  • учет - для каждого региона, во время замечания, G1 отслеживает ливни региона (сколько объектов живет в каждом регионе) и ссылается на регион ( Remembered Set ) - это говорит G1, сколько времени занимает сбор данных в этом регионе.
  • Пустые регионы восстановлены

2,3. GC пауза (смешанная)

  • выберите регионы с низкой живостью и соберите некоторые из них. Следовательно, мы собираем «мусор в первую очередь».
  • фактический сбор этих регионов выполняется одновременно со следующим GC Young, поэтому нет отдельной паузы для сбора OldGen. Следовательно, GC pause (mixed) представляет собой смешанную коллекцию YoungGen и часть старого Gen.
  • В конце паузы GC (смешанная) в старых областях генов может остаться немного мусора, который будет собираться позже в зависимости от будущей активности, времени паузы и количества неиспользованных областей.

3. Полный GC

Обратите внимание, что G1 предназначен, чтобы максимально избежать Full GC. Начиная с Java 7u40, паузы FullGC в G1 не оптимизируются и реализуются как однопоточная операция. При использовании G1 старайтесь избегать Full GC - если вы видите какие-либо паузы FullGC, ваша настройка GC, вероятно, требует некоторой настройки.

Ресурсы

0 голосов
/ 20 января 2018

Я обнаружил, что Страница Oracle очень полезна для объяснения концепций в доступной форме, не будучи слишком длинной.

...