Флаг переназначения установлен gc в ZGC?
Цикл сборки мусора ZGC состоит из двух основных этапов: маркировки и перемещения. Во время фазы маркировки во всех ссылках на активный объект устанавливается один из флагов Mark0 или Mark1 (флаги используются поочередно циклами сборки мусора [1]).
Для простоты предположим, что все объекты в куче находятся в рабочем состоянии, т.е. перемещение не требуется. (Предположим далее, что финализатор не ссылается ни на один объект, и что ни один объект не создается во время цикла gc)
Вопрос: Какой флаг (т.е. переназначенный или отмеченный0 / отмеченный1) установлен в ссылках после завершения цикла сборки мусора?
Предпосылки: когда приложение вызывает объект, барьер нагрузки проверяет флаги в ссылке и предпринимает действия (см. Блок-схему с синими фигурами в [2]). Флаг переназначения указывает, что ссылка актуальна, то есть к объекту можно получить прямой доступ по ссылке. Если флаг переназначения не установлен, требуется дополнительная проверка, что снижает производительность приложения. Поэтому было бы желательно, чтобы сборщик мусора установил переназначенный флаг. Однако в любой момент времени устанавливается только один из переназначенных флагов, отмеченный0, отмеченный1 ([2] "Мульти-отображение"). Поскольку на этапе маркировки установлено значение Mark0 / Mark1, я считаю, что переназначен не может быть установлен сборщиком мусора ZGC. Что меня беспокоит, так это то, что производительность приложения после цикла gc будет хуже, чем до цикла.
[1] https://dinfuehr.github.io/blog/a-first-look-into-zgc
[2] https://www.opsian.com/blog/javas-new-zgc-is-very-exciting