Получить доступ

Зачем при конкурентной маркировке сборщику нужны барьеры записи?

SeniorJVM и сборка мусора
Коротко

Пока сборщик маркирует, приложение меняет ссылки: может перенести ссылку с непросмотренного объекта на уже просмотренный — живой объект останется непомеченным и будет освобождён. Барьер записи — код, вставленный JIT в каждую запись ссылки, сообщает сборщику об изменении.

  • Трёхцветная маркировка: белый, серый, чёрный
  • G1 — SATB (snapshot at the beginning): помнит старое значение ссылки
  • ZGC и Shenandoah — ещё и барьеры чтения для конкурентного перемещения

А ещё Цена — немного CPU на каждую запись ссылки

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Проблема в том, что пока сборщик обходит граф, приложение может переставить ссылку с ещё не просмотренного участка на уже просмотренный: объект окажется достижимым, но помеченным не будет, и его освободят — это разрушило бы корректность. Барьер записи — небольшой фрагмент кода, вставляемый компилятором в каждую операцию присваивания ссылки, — фиксирует такие изменения, чтобы сборщик их учёл. Разные сборщики используют разные схемы, например снимок на начало цикла в G1. Отсюда следует важная мысль для собеседования: конкурентные сборщики не бесплатны — они переносят часть работы в потоки приложения и слегка замедляют каждую запись ссылки, покупая за это короткие паузы. Полностью избавиться от остановок тоже не выходит: короткие паузы нужны хотя бы для обхода корней.

Что хотят услышать

  • Проблема потерянного объекта.
  • Что делает барьер.
  • Подходы разных сборщиков.

Частые ошибки

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

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Приложение продолжает менять ссылки во время маркировки, и без перехвата этих изменений живой объект может быть ошибочно признан мусором
  • ✗Чтобы синхронизировать доступ нескольких потоков сборщика к одной области памяти
  • ✗Чтобы ускорить копирование объектов между поколениями
  • ✗Чтобы вести журнал изменений для последующего восстановления кучи

Что спросят дальше

  • Почему даже у ZGC остаются короткие паузы?
  • Что такое safepoint и зачем он нужен?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем