Ответ
В Go GC использует алгоритм триколорной маркировки (tricolor mark-and-sweep). Объект считается достижимым, если на него есть ссылка из корневых объектов (стек, глобальные переменные, регистры) или из других достижимых объектов.
- Маркировка: GC обходит граф объектов, помечая достижимые (белый → серый → черный).
- Сборка: Непомеченные (белые) объекты считаются мусором и удаляются.
Пример:
func main() {
a := new(int) // Создаем объект в куче
a = nil // Теряем ссылку — объект теперь недостижим
// На следующем цикле GC удалит его
}
Нюансы:
- GC работает конкуррентно (не всегда останавливает программу).
- Можно управлять через
GOGC(процент роста кучи перед сборкой). - Циклические ссылки не проблема — GC их обнаружит.