Ответ
Сборщик мусора (GC) в Go использует конкурентный (concurrent) трехцветный алгоритм пометки и очистки (mark-and-sweep).
Ключевые особенности:
Конкурентность: Большая часть работы GC (пометка и очистка) выполняется одновременно с основной программой, а не останавливая её. Это обеспечивает очень короткие паузы.
Трехцветный алгоритм: Объекты в памяти условно делятся на три цвета:
- Белые: Кандидаты на удаление (изначально все объекты белые).
- Серые: Достижимые объекты, но ссылки из них еще не проверены.
- Черные: Достижимые объекты, все ссылки из них проверены.
GC "перекрашивает" объекты из белых в серые, а затем в черные, начиная с корневых объектов (глобальные переменные, стеки горутин).
Минимальные паузы "Stop-The-World" (STW): Программа полностью останавливается лишь на очень короткие промежутки времени (обычно меньше миллисекунды) для выполнения операций, которые нельзя сделать конкурентно, например, для включения барьера записи (write barrier) в начале цикла.
Отсутствие поколений (Non-generational): В отличие от GC в Java или .NET, сборщик мусора в Go не делит объекты на "молодые" и "старые" поколения. Он каждый раз сканирует всю кучу.
Управление: Поведением GC можно управлять с помощью переменной окружения
GOGC
. Она устанавливает процент роста кучи, который запускает следующий цикл сборки мусора.GOGC=100
(значение по умолчанию) означает, что новый цикл GC начнется, когда размер кучи увеличится на 100% по сравнению с размером после предыдущей сборки.