Как Garbage collector понимает, что объект можно уничтожить

«Как Garbage collector понимает, что объект можно уничтожить» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go GC использует алгоритм триколорной маркировки (tricolor mark-and-sweep). Объект считается достижимым, если на него есть ссылка из корневых объектов (стек, глобальные переменные, регистры) или из других достижимых объектов.

  1. Маркировка: GC обходит граф объектов, помечая достижимые (белый → серый → черный).
  2. Сборка: Непомеченные (белые) объекты считаются мусором и удаляются.

Пример:

func main() {
    a := new(int) // Создаем объект в куче
    a = nil       // Теряем ссылку — объект теперь недостижим
    // На следующем цикле GC удалит его
}

Нюансы:

  • GC работает конкуррентно (не всегда останавливает программу).
  • Можно управлять через GOGC (процент роста кучи перед сборкой).
  • Циклические ссылки не проблема — GC их обнаружит.