Write barrier — механизм, позволяющий GC работать одновременно с приложением (concurrent GC). Без него GC не мог бы корректно отслеживать изменения графа объектов.
Проблема: пока GC сканирует объекты (mark phase), приложение может менять указатели — GC может пропустить живой объект и удалить его.
Решение — write barrier: компилятор вставляет дополнительный код при каждой записи указателя:
// Что пишет программист:
obj.field = newValue
// Что генерирует компилятор (псевдокод):
writeBarrier(obj, &obj.field, newValue)
obj.field = newValue
В Go используется hybrid write barrier (с Go 1.8):
- Комбинация Dijkstra (shade new pointer) + Yuasa (shade old pointer)
- Не требует re-scan стеков (это было дорого)
- Горутины стартуют с чёрными стеками
Цена: ~5-10% overhead на запись указателей во время GC. Но это позволяет STW-паузам быть <1мс.