Я пытаюсь понять, как ZG C работает в деталях. Давайте рассмотрим простой Java пример:
var v = new Object[]{ new Object() };
Давайте назовем
- a : объект массива
- o : объект, на который ссылается v [0]
- r : ссылка на a
- s : ссылка на o
На рисунке ниже графически показаны артефакты:
Предположим что первый цикл g c начинается и a , o перемещаются. Далее предположим, что приложение не имеет доступа к объектам.
g c цикл 1:
a) Фаза маркировки: в конце фазы маркировки устанавливается бит отмеченный0 r , s .
b) Фаза перемещения: сначала объект root a перемещается, r переназначается в новое местоположение, а переназначается бит r установлен. Затем o перемещается, и новое местоположение o записывается в таблицу пересылки.
Примечание: Ссылки, возникающие в куче, не перераспределяются на этапе перемещения ( 2 в 9:20) - они переопределяются на следующем этапе маркировки ( или через барьер загрузки, если приложение загружает ссылку до следующей фазы маркировки). Следовательно, насколько я понимаю, бит отмеченный 0 все еще установлен в с .
г c цикл 2:
a) Фаза маркировки:
a1) отмечен 1 бит r установлено.
a2) Поскольку переназначенный бит s не задан, g c просматривает таблицу переадресации и видит запись для o , переназначает s в новое местоположение o и удаляет запись из таблицы пересылки.
Вопрос: Какой из цветовых битов s теперь установлен?
Замечание: Поскольку s только что был переназначен, было бы естественно установить бит remapped . Но g c также находится в фазе маркировки, поэтому необходимо установить бит mapped1 .
Почему это важно: Если на шаге a2) установлен бит , помеченный , это означает, что, как правило, после завершения фазы маркировки все ссылки начинаются с куча установила помеченный бит. Таким образом, всякий раз, когда приложение загружает ссылку из кучи в первый раз после завершения фазы маркировки, барьер загрузки должен проверить путем обращения к таблице переадресации, была ли ссылка переназначена.
Это (i) нагрузка на производительность и (ii) излишняя, потому что g c знает из этапа переназначения (этап a2) в примере), что ссылка была переназначена. Таким образом, либо алгоритм не является оптимальным, либо биты цвета устанавливаются не так, как описано выше.