Я знаю, что в CMS и G1 куча делится на пространства Eden, Survivor и Old Generation с той лишь разницей, что в CMS это разделение реально (эти пространства смежны и находятся в разных частях памяти), а в G1 оно логично (куча разбивается на ±2000 динамических областей от 1 до 32 МБ каждая).
В обоих случаях, когда пространство Эдема заполнено порогом, начинается эвакуация Юнга, и шаги следующие: Начальная маркировка. СТВ. Отметьте корни приложения. Параллельная маркировка. Из корней ссылок идут переходы к объектам от этих объектов к другим объектам и таким образом достигнутые объекты помечаются живыми. Примечание. СТВ. Объекты, созданные во время параллельной маркировки, также помечаются как живые (плавающий мусор). Очистка Этот заключительный этап подготавливает почву для предстоящей фазы эвакуации, подсчитывая все живые объекты в областях кучи и сортируя эти области по ожидаемой эффективности GC.
Если наполнение кучи достигает порога, то в G1 начинается смешанная эвакуация (Young + Old). Основание мертвых объектов в Old Generation основано на «запомненных наборах». Каждый регион имеет запоминаемый набор, в котором перечислены ссылки, указывающие на этот регион извне. Эти ссылки рассматриваются как дополнительные корни GC.
После того, как G1 принимает решение, какие регионы из старого и молодого поколения добавить в набор сбора.
Зачем нужны запоминаемые наборы и конкретный поиск недоступных объектов в Old Generation, если у нас есть весь граф всех объектов и мы знаем все живые и мертвые объекты после их маркировки на эвакуационном уровне Юнга?