Подтвердить что ты не робот

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

A typical G1 heap may look like:

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

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

1.1 Молодая фаза - Малый GC

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

1.2 Молодой/начальный знак

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

2. Коллекция старого поколения

2.1 Начальный знак - см. 1.2.

2.2 Замечание GC

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

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

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

3. Полный GC

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

Ресурсы