2014-10-09 6 views
4

Я пытаюсь понять механизмы сбора мусора, и я нахожусь на алгоритмах генерации, и у меня есть вопрос о различиях между молодыми/старыми поколениями. Я прочитал, что для начала сбора объектов в молодом поколении GC маркирует их, начиная с корней GC, чтобы найти живые, и обычно он копирует их в пространство для оставшихся в живых, очищает зону молодого поколения и вуаля.Утилизация мусора сканирование молодого поколения

Я не понимаю, если мы начнем с корней GC, и мы начнем проходить через живые объекты, не найдем ли мы и объект старого поколения? Означает ли это, что когда мы попадаем в объект в старом пространстве, мы перестаем отслеживать ссылки в этой точке или что?

+1

Простой ответ: Да. Коллекция молодого поколения не отслеживает и не маркирует объекты в старшем поколении. Когда коллекционер молодого поколения находит ссылку «от старого до старого», он игнорирует его. –

ответ

2

Хотя я не проверял это напрямую, здравый смысл диктует, что обход графика объекта свертывается каждый раз, когда встречается объект из старого поколения. Обратите внимание, что эта проверка очень дешевая: для определения размещения объекта в пределах области кучи достаточно простой проверки диапазона по значению указателя.

Существует, однако, еще один важный момент для рассмотрения: что, если молодой объект доступен только через старый объект? Очевидно, что Старое Поколение должно рассматриваться как как-то.

Введите таблицукарты: это структура подложки перед каждой области кучи, где проходит сжатый «точечный рисунок» вид области, таким образом, что каждый бит соответствует, скажем, 256 байт кучи. Каждый раз, когда обновляется эталонная переменная, соответствующий бит в таблице карт увеличивается до 1, что означает «грязный».

С карточным столом на месте в каждой коллекции YG происходит следующее: все куски кучи, отмеченные как «грязные», отсканированы для указателей на объекты внутри молодого поколения. Каждый найденный таким образом объект считается доступным.

Коррола из вышеперечисленного: молодые объекты, достигаемые через старый объект, который тем временем превратился в мусор, будут считаться доступными и загрязняют кучу до тех пор, пока не произойдет крупный GC.

+0

Спасибо Марко! Вы коснулись темы моих следующих вопросов - карточек. Область карты имеет 256 байтов, но, насколько я понимаю, это память строк, вам нужно знать соответствующие классы, чтобы понять ее. Итак, если мы знаем область памяти, откуда мы знаем, что она держит или что она содержит ссылки вообще? Что еще там? :) – alobodzk

+0

Да, я знаком с заботой, но не знаю деталей. Например, память может быть отсканирована для покрытия заголовка объекта. Когда вы знаете заголовок, вы знаете класс. Кроме того, каждое слово может быть * предполагается * указателем, а затем разыменовано, чтобы определить, указывает ли он на допустимый заголовок объекта. Это эвристика, но это, вероятно, «достаточно хорошо». –

+0

Я не думаю, что это должно быть эвристическим. JVM может выполнять итерацию объектов на основе информации о размерах узлов в каждом заголовке объекта. Или он может записывать адрес первого заголовка объекта на каждой карте (или в последовательности карт) и итерации на основе этого. –

1

Когда GC работает в Молодом поколении, это называется Малой коллекцией. Этот тип коллекции не интересует объекты старого поколения.

И да объекты, которые могут достигать непосредственно из корней, обозначены как живые, но они могут находиться в другом месте кучи, чтобы они могли быть объектами в Старом Поколении.

Даже если объект Старый Gen достижимы, небольшие коллекции не будет востребовать мусор в Старом Быт

Цитируя HotSpot doc:

Когда молодое поколение заполняет это вызывает небольшую коллекцию в которые собирают только молодое поколение; мусора в других поколений не утилизирован

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

Я нашел это IBM article, которые объясняют, как работает отслеживание ссылок между поколениями в GC HotSpot.

+0

Но это точно мой вопрос, как это возможно, что объекты Old Generation не интересуются этим типом коллекции? Если они живы, их нужно называть из корней GC, не так ли? – alobodzk

+0

Да Объекты OldGen доступны из корней. Как сказал Стивен С, небольшие коллекции не возвращают мусор в другие поколения, даже если они достижимы. –

Смежные вопросы