Назад к вопросам
Middle+
718
questionbank

Как работает сборщик мусора в языке программирования Go?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Сборщик мусора в Go основан на маркирующем-удаляющем алгоритме с триггером по выделению памяти. Он работает параллельно с основной программой и минимизирует паузы.

Ключевые моменты:

  • Три набора цветов:
    • Белый: Объекты, которые не были посещены и потенциально являются мусором.
    • Серый: Объекты, доступные из корней, но еще не просканированные.
    • Черный: Объекты, доступные из корней и уже просканированные.
  • Маркировка: Сборщик начинается с корней (глобальные переменные, стек каждого горутины), помечая доступные объекты как серые. Затем он рекурсивно сканирует серые объекты, помечает достижимые из них как серые, а сканируемые объекты становятся черными.
  • Фаза STW (Stop-The-World) во время маркировки: Кратковременная остановка выполнения всех горутин в начале маркировки для создания снимка графа объектов и в конце для переключения состояния.
  • Параллельная маркировка: Основная часть маркировки выполняется параллельно с работой программы.
  • Удаление: После маркировки все объекты, оставшиеся белыми, считаются недостижимыми и освобождаются. Go не требует явного обнуления указателей.
// Пример: когда объект становится недостижимым
type Data struct {
    value int
}

func main() {
    d1 := &Data{value: 10} // Объект создан, доступен
    _ = d1                 // Использование объекта

    d1 = nil // Объект больше недостижим из переменной d1.
            // Сборщик мусора может его освободить при следующем цикле.

    // Другие объекты, на которые никто не ссылается, также могут быть собраны.
}
  • Триггер: Сборщик запускается, когда объем выделенной памяти превышает некоторый порог, зависящий от предыдущего объема выделенной памяти. По умолчанию этот порог в два раза больше предыдущего использованного объема памяти.
  • Цель: Поддерживать низкую задержку, избегая длительных пауз "Stop-The-World".
// Можно управлять поведением сборщика с помощью переменных окружения
// 예를 들어, GOGC=off를 설정하면 가비지 수집이 비활성화됩니다.

В целом, сборщик мусора Go эффективен и требует минимального участия разработчика.