Установлен ли флаг переназначения g c в ZG C? - PullRequest
0 голосов
/ 13 января 2020

Цикл сбора мусора ZG C состоит из двух основных этапов: маркировка и перемещение. Во время фазы маркировки во всех ссылках на живой объект устанавливается один из флагов отмеченный0 или отмеченный1 (флаги используются попеременно циклами сборки мусора [1]).

Для простоты предположим, что все объекты в куче являются живыми, то есть перемещение не требуется. (Предположим далее, что финализатор не ссылается ни на один объект и что в течение цикла g c объект не создается)

Вопрос: Какой флаг (т. Е. remapped или отмечен0 / отмечен1 ) установлен в ссылках после завершения цикла сборки мусора?

Фон: когда приложение вызывает объект, барьер загрузки проверяет флаги в ссылке и предпринимает действия (см. Блок-схему с синими фигурами в [2]). Флаг переназначения указывает, что ссылка актуальна, то есть объект может быть напрямую доступен по ссылке. Если переназначенный флаг не установлен, требуется дополнительная проверка, что снижает производительность приложения. Поэтому было бы желательно, если бы сборщик мусора установил переназначенный флаг. Однако только один из флагов переназначен , отмечен0 , отмечен1 установлен в любой момент времени ([2] «Мульти-отображение»). Поскольку на этапе маркировки отмечен0 / отмечен 1 , я считаю, что переназначенный не может быть установлен сборщиком мусора ZG C. Меня беспокоит то, что тогда производительность приложения после цикла g c будет хуже, чем до цикла.

[1] https://dinfuehr.github.io/blog/a-first-look-into-zgc

[2] https://www.opsian.com/blog/javas-new-zgc-is-very-exciting

...