Что такое write barrier в GC?

Senior
291 просмотров
AFK Offer AI

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 стеков (это было дорого)
  • Горутины стартуют с чёрными стеками
Write barrier активен только во время mark phase GC. В остальное время — обычная запись без overhead.

Цена: ~5-10% overhead на запись указателей во время GC. Но это позволяет STW-паузам быть <1мс.

Следующий вопрос

Как найти goroutine leak?