Зачем нужен специфический поиск недоступных объектов в Old Generation, если мы знаем все мертвые объекты после их маркировки в Young Generation?

Я знаю, что в CMS и G1 куча делится на пространства Eden, Survivor и Old Generation с той лишь разницей, что в CMS это разделение реально (эти пространства смежны и находятся в разных частях памяти), а в G1 оно логично (куча разбивается на ±2000 динамических областей от 1 до 32 МБ каждая).

В обоих случаях, когда пространство Эдема заполнено порогом, начинается эвакуация Юнга, и шаги следующие: Начальная маркировка. СТВ. Отметьте корни приложения. Параллельная маркировка. Из корней ссылок идут переходы к объектам от этих объектов к другим объектам и таким образом достигнутые объекты помечаются живыми. Примечание. СТВ. Объекты, созданные во время параллельной маркировки, также помечаются как живые (плавающий мусор). Очистка Этот заключительный этап подготавливает почву для предстоящей фазы эвакуации, подсчитывая все живые объекты в областях кучи и сортируя эти области по ожидаемой эффективности GC.

Если наполнение кучи достигает порога, то в G1 начинается смешанная эвакуация (Young + Old). Основание мертвых объектов в Old Generation основано на «запомненных наборах». Каждый регион имеет запоминаемый набор, в котором перечислены ссылки, указывающие на этот регион извне. Эти ссылки рассматриваются как дополнительные корни GC.

После того, как G1 принимает решение, какие регионы из старого и молодого поколения добавить в набор сбора.

Зачем нужны запоминаемые наборы и конкретный поиск недоступных объектов в Old Generation, если у нас есть весь граф всех объектов и мы знаем все живые и мертвые объекты после их маркировки на эвакуационном уровне Юнга?


person Community    schedule 29.11.2017    source источник
comment
Я могу только предположить, что вы имели в виду «смежный», а не «заразный».   -  person user207421    schedule 29.11.2017


Ответы (1)


Идея запомненного набора (или таблицы карт в CMS) заключается не в «поиске недоступных объектов в старом поколении», а в быстром определении ссылок в старом поколении, которые необходимо обновить при перемещении живых объектов во время сбора Юнга.

Адрес эвакуированного объекта изменен => все входящие ссылки на этот объект должны быть обновлены. Без запомненных наборов потребовалось бы просканировать всю кучу, чтобы найти все входящие ссылки (это, конечно, может занять слишком много времени).

person apangin    schedule 29.11.2017
comment
Перед операцией с объектами из Young g. GC сканирует всю кучу, чтобы найти недоступные, чтобы ссылки можно было обновить, используя результат сканирования, я прав? - person ; 29.11.2017
comment
@PavelPavel Нет, этап маркировки требуется для поиска доступных объектов, а не недоступных. Кроме того, Young GC не нужно проходить через всю кучу, собирая только корневой набор плюс регионы. - person apangin; 29.11.2017
comment
но если мы знаем достижимое, значит, мы знаем и недостижимое, не так ли? - person ; 29.11.2017
comment
@PavelPavel Не совсем. По определению мы не можем достичь недостижимых объектов, обходя граф объектов. Вместо этого требуется полное сканирование кучи. - person apangin; 30.11.2017
comment
Но я предполагал, что мы храним необходимую информацию об объектах в метапространстве и после сканирования просто вычитаем одно из другого - person ; 30.11.2017
comment
@PavelPavel Metaspace - это совершенно другая концепция, она не имеет ничего общего с графом объектов, сканированием кучи и т. д. - person apangin; 30.11.2017