Зачем при конкурентной маркировке сборщику нужны барьеры записи?
Пока сборщик маркирует, приложение меняет ссылки: может перенести ссылку с непросмотренного объекта на уже просмотренный — живой объект останется непомеченным и будет освобождён. Барьер записи — код, вставленный JIT в каждую запись ссылки, сообщает сборщику об изменении.
- Трёхцветная маркировка: белый, серый, чёрный
- G1 — SATB (snapshot at the beginning): помнит старое значение ссылки
- ZGC и Shenandoah — ещё и барьеры чтения для конкурентного перемещения
А ещё Цена — немного CPU на каждую запись ссылки
Подробно
Проблема в том, что пока сборщик обходит граф, приложение может переставить ссылку с ещё не просмотренного участка на уже просмотренный: объект окажется достижимым, но помеченным не будет, и его освободят — это разрушило бы корректность. Барьер записи — небольшой фрагмент кода, вставляемый компилятором в каждую операцию присваивания ссылки, — фиксирует такие изменения, чтобы сборщик их учёл. Разные сборщики используют разные схемы, например снимок на начало цикла в G1. Отсюда следует важная мысль для собеседования: конкурентные сборщики не бесплатны — они переносят часть работы в потоки приложения и слегка замедляют каждую запись ссылки, покупая за это короткие паузы. Полностью избавиться от остановок тоже не выходит: короткие паузы нужны хотя бы для обхода корней.
Что хотят услышать
- Проблема потерянного объекта.
- Что делает барьер.
- Подходы разных сборщиков.
Частые ошибки
- Считать конкурентную сборку полностью бесплатной для приложения.
- Думать, что современные сборщики совсем не останавливают приложение.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Чтобы синхронизировать доступ нескольких потоков сборщика к одной области памяти
- ✗Чтобы ускорить копирование объектов между поколениями
- ✓Приложение меняет ссылки, и живой объект можно потерять
- ✗Чтобы вести журнал изменений для последующего восстановления кучи
Что спросят дальше
- Почему даже у ZGC остаются короткие паузы?
- Что такое safepoint и зачем он нужен?
Разбор темы
- GC: алгоритмы и сборщики
Mark-sweep-compact и копирование, stop-the-world и safepoints, конкурентная маркировка, G1 и ZGC и выбор по throughput/latency.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.