Как работает сборщик мусора?

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

Спасибо

3 ответа

Решение

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

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

Есть JavaOne поговорить о G1 и несколько статей на эту тему:

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

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

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

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

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

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

Вот краткое описание каждой фазы G1:

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

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

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

1.2 Young / Initial Mark

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

2. Old Gen Collection

2.1 Начальная отметка - см. 1.2.

2.2 ГК замечание

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

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

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

3. Полная сборка

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

Ресурсы

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

Другие вопросы по тегам