Давайте сначала расставим некоторые вещи в правильном порядке. Card Table
показывает, что могут быть входящие ссылки в этот регион. Это своего рода хэш. Для одного байта в картотеке - в старом регионе много байтов. Это все равно, что сказать, что если (теоретически) у вас есть карточный стол, который выглядит так (одна карта помечена как грязная)
0 1 0 0 0 0
Для этой 1
(грязной карты) есть определенное отображение в старом регионе, которое также необходимо сканировать при сканировании молодых регионов.
0 1 0 .....
0 - 512 512-1024 ...........
Таким образом, эта грязная карта соответствует определенной части (от 512 до 1024 байт) в старом поколении, которая также будет сканироваться в рамках сканирования молодого поколения.
У G1 есть регионы, и теперь вам нужно понять, как CT
и RS
работают в тандеме. Допустим, GC сканирует Region1
в этот момент времени, берет все живое из этого региона и копирует в Region2
. В то же время Region2
имеет ссылки на Region3
. Если мы используем CT
, Region2
будет помечено как грязное (поместив определенную карту в таблицу карт).
Следующий цикл хочет отсканировать Region3
. Как Region3
узнает, есть ли другие регионы, которые могут указывать на него? И действительно бывают такие случаи: Region2
ссылается на Region3
. Что ж, он может заглянуть в CT
и проверить каждую грязную карту (и, следовательно, каждый регион, которому соответствуют эти грязные карты) и посмотреть, есть ли здесь ссылки из какого-либо из этих регионов. Подумайте об этом: чтобы очистить Region3
, G1
должен просмотреть все CT
. В худшем случае он должен сканировать всю кучу — для одного региона.
Таким образом: Remembered Sets
. Эти структуры данных заполняются асинхронным потоком на основе того, о чем знает CT
. Когда Region2
помечен как грязный, асинхронный поток начнет вычислять его RS
. Когда Region3
нужно отсканировать, его RS
будет иметь запись только с Region2
.
Таким образом, чтобы сканировать один регион, G1
только нужно изучить этот конкретный RS
.
person
Eugene
schedule
28.12.2020