Java G1GC — Таблица карточек (CT) против запомненного набора (RS)

Зачем g1 нужны обе эти структуры данных?

Мое понимание:

  1. CT хранит информацию о фактическом расположении ссылок в старом поколении.
  2. RS специфичен для каждого региона, с каждым регионом связан один RS, он хранит информацию о внешних ссылках, которые указывают на объекты в этом регионе. Таким образом, при навигации по RS фактическое местоположение ориентира можно найти с помощью CT.

Почему RS не может хранить всю информацию вместо использования CT?

Это потому, что в противном случае было бы слишком много дублирующихся данных, хранящихся в разных RS? Например, у молодого поколения есть регионы A и B, объекты в обоих этих регионах имеют одинаковую внешнюю ссылку из старого поколения. В этом случае обе RS, связанные с областью A и B, будут хранить эту информацию, которая является избыточной. Правильно ли это объяснение?


person user10916892    schedule 28.12.2020    source источник


Ответы (1)


Давайте сначала расставим некоторые вещи в правильном порядке. 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
comment
Спасибо, это то, что я искал. Быстрый вопрос — Итак, когда RS для Region3 обновляется/заполняется, это когда Region2 помечен как грязный? - person user10916892; 29.12.2020
comment
@user10916892 user10916892 Я этого не помню, и это могло измениться в последних версиях. Что важно, так это то, что он делает. - person Eugene; 29.12.2020