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