Почему CMS останавливает мир для начальной отметки, а не для фазы подметания?

Есть 4 фазы высокого уровня CMS работает для полного GC

  1. Начальная отметка: - Остановить мир (STW)
  2. Параллельная маркировка: - Запускать одновременно
  3. Примечание: - STW
  4. Параллельная подметание: - Запускать одновременно

Я получил высокий уровень понимания CMS после прочтения

http://www.tikalk.com/java/garbage-collection-serial-vs-parallel-vs-concurrent-mark-sweep/ и https://plumbr.eu/handbook/garbage-collection-algorithms-implementations/concurrent-mark-and-sweep

Мой вопрос: почему начальный этап оценки является STW для этапа Initial Mark? Разве мы не можем использовать только этап Remark в качестве STW, поскольку это последний этап согласования.

Точно так же, почему Sweeping phase не является STW, поскольку для этого потребуется уплотнение, что означает изменение физического местоположения объекта. Итак, если на объект ссылается приложение, а параллельный поток меняет физическое местоположение, не будет ли это проблемой?

Я знаю, что я что-то упускаю здесь, но что это?


person emilly    schedule 25.09.2016    source источник


Ответы (1)


Я предполагаю, что вы имеете в виду реализацию Concurrent Mark Sweep в Oracle HotSpot JVM.

Начальная фаза пометки включает сканирование молодого пространства (любая ссылка на старую и молодую является корнем для параллельной пометки). Этап замечания включает в себя ту же самую операцию.

Теоретически вы можете опустить STW для начальной метки, так как сканирование происходит одновременно с риском пропуска нескольких корней (которые в любом случае будут восстановлены во время финальной метки). Хотя здесь есть минусы

  • Сканирование памяти может быть неточным, так как молодая коллекция представляет собой движущиеся объекты. Синхронизация между старым коллектором и молодым коллектором станет еще более сложной.
  • Если какой-то корень будет пропущен во время неточной начальной отметки, реплика может стать значительно длиннее, так как будет включать обход объектов, достижимых из вновь найденных корней.

Подметание не требует STW, потому что оно не уплотняет. CMS не сжимает старое пространство в параллельных циклах.

Вот моя статья, объясняющая природу и асимптотику CMS GC паузы

person Alexey Ragozin    schedule 26.09.2016
comment
Меня беспокоит тот же вопрос, что и ОП (кроме части с подметанием). Я все еще в замешательстве после прочтения вашего ответа. Почему отсутствие нескольких корней является такой большой проблемой, даже если начальная метка сделана с помощью STW, многие новые корни также могут появиться сразу после этой фазы. - person ContentPenalty; 03.05.2019
comment
Создан новый новый объект изображения. Он еще не помечен как достижимый. Если бы GC не был очень консервативным, объект считался бы мусором, но он все еще достижим из графа объектов. - person Alexey Ragozin; 04.05.2019
comment
Но разве это не исправлено на этапе примечания, который обрабатывает все, что было изменено с момента начала пометки? Что на самом деле меняет первоначальная отметка STW? - person ContentPenalty; 04.05.2019
comment
@ContentPenalty, вы правы, замечание исправляет это. Проблема в том, что большинство корней являются локальными переменными. GC должен сканировать стеки для потоков приложений. Это можно сделать только с STW. Без этой одновременной маркировки слишком много объектов останется неотмеченными, что резко увеличит объем работы на этапе замечаний STW. - person Alexey Ragozin; 05.05.2019
comment
Итак, если я правильно понимаю, начальная метка - STW, потому что сканирование стеков потоков не может выполняться одновременно. Знаете почему, это из-за каких-то физических ограничений или просто потому, что это было бы в некотором роде проблематично? - person ContentPenalty; 05.05.2019