Golang использует параллельный и сборщик мусора с низкой задержкой на основе марк-свип алгоритма.
Основные характеристики:
- Триколор-алгоритм (Three-color algorithm): Помечает объекты тремя цветами: белым (потенциальный мусор), серым (объект достижим, но его потомки не проинспектированы) и чёрным (объект и его потомки достижимы).
- Параллельность (Parallel): Работает параллельно с пользовательскими горутинами на нескольких ядрах, минимизируя время остановки.
- Конкурентность (Concurrent): Большая часть работы GC выполняется одновременно с выполнением программы.
- Минимизация стоп-ворлд времени (Low-latency Stop-The-World): Время остановки всех горутин (STW) крайне короткое, используется только для фазы "начало маркировки" (start of marking) и "завершение маркировки" (end of marking), чтобы обеспечить согласованность графа объектов.
- Переиспользуемые сканы (Stack scanning): Сканирование стеков также выполняется параллельно и конкурентно с STW.
- Целевой уровень заполнения хипа (Heap growth target): GC стремится поддерживать определённый процент заполнения хипа после каждого цикла, чтобы избегать слишком частых или слишком редких циклов. Этот порог можно контролировать через переменную
GOGC
. По умолчанию GOGC=100
, что означает, что GC запускается, когда размер хип