Ответ
Сборщик мусора (GC) в Go — это конкурентный (concurrent), не-генерационный сборщик, использующий алгоритм маркировки и очистки с трехцветной разметкой (tricolor mark-and-sweep). Его главная цель — минимизация пауз (stop-the-world) для достижения низкой задержки (low latency) в приложениях.
Ключевые принципы:
Трехцветный алгоритм: Все объекты в куче делятся на три множества:
- Белые (White): Потенциальный мусор. В начале цикла все объекты белые.
- Серые (Gray): Достижимые объекты, но их дочерние объекты еще не просканированы. Это "фронт" работы для GC.
- Черные (Black): Достижимые объекты, все дочерние объекты которых также просканированы.
Конкурентность: Основная работа по маркировке (сканирование графа объектов) происходит конкурентно, то есть параллельно с выполнением горутин вашего приложения. Это позволяет избежать долгих пауз.
Write Barrier (Барьер записи): Специальный механизм, который включается во время работы GC. Если горутина изменяет указатель, например, черный объект начинает ссылаться на белый, барьер записи перекрашивает белый объект в серый. Это гарантирует, что GC не пропустит живой объект.
Этапы работы (упрощенно):
- Mark Setup (Подготовка к маркировке): Короткая пауза (STW), во время которой включается барьер записи.
- Marking (Маркировка): GC сканирует граф объектов, начиная с корней (глобальные переменные, стеки горутин), и перекрашивает объекты из белых в серые, а затем в черные. Этот этап выполняется конкурентно.
- Mark Termination (Завершение маркировки): Вторая короткая пауза (STW) для завершения маркировки и отключения барьера записи.
- Sweeping (Очистка): Память, занятая белыми (недостижимыми) объектами, освобождается. Этот этап также выполняется конкурентно.
Управление:
- Переменная окружения
GOGC
(по умолчанию100
) контролирует, когда запускается следующий цикл GC.GOGC=100
означает, что GC запустится, когда размер кучи достигнет 200% от размера живых объектов после предыдущего цикла. - Принудительный запуск:
runtime.GC()
.