Как работает сборщик мусора в Go?go-63

Сборщик мусора (Garbage Collector, GC) в Go — это механизм автоматического управления памятью, который освобождает память, занятую объектами, ставшими недостижимыми. Вот детальное объяснение его работы:

1. Основные принципы

  • Трехцветный алгоритм маркировки и очистки: Go использует модифицированную версию этого алгоритма.
  • Параллельный и не вытесняющий: GC работает параллельно с программой, но требует коротких пауз (stop-the-world).

2. Фазы работы GC

Фаза маркировки

  1. Корневые объекты: GC начинает с маркировки корневых объектов (глобальные переменные, стек вызовов, регистры процессора).
  2. Обход графа: Помечает все достижимые объекты, обходя граф ссылок.
  3. Трехцветная система:
    • Белый: Не посещенный объект.
    • Серый: Посещенный, но его соседи еще не проверены.
    • Черный: Посещенный и все его ссылки обработаны.

Фаза очистки

  • Освобождает память, занятую белыми (недостижимыми) объектами.
  • Использует пулы памяти (span) для эффективного переиспользования.

3. Оптимизации в Go GC

  • Write Barrier: Механизм, который отслеживает изменения указателей во время фазы маркировки.
  • Триггеры GC:
    • По достижении порога памяти (GOGC, по умолчанию 100%).
    • Принудительно через runtime.GC().
  • Pacer: Алгоритм, который регулирует частоту запусков GC, чтобы минимизировать накладные расходы.

4. Пример работы

type Node struct {
    value int
    next  *Node
}

func main() {
    a := &Node{value: 1}  // Создаем объект в куче
    b := &Node{value: 2}
    a.next = b             // Ссылка между объектами
    a = nil                // Объект 'a' становится недостижимым
    // GC освободит память 'a' в следующем цикле
}

5. Настройки и мониторинг

  • Переменные окружения:
    • GOGC: задает процент роста кучи для запуска GC.
    • GODEBUG=gctrace=1: выводит логи GC.
  • Инструменты:
    • pprof для анализа использования памяти.
    • runtime.ReadMemStats для программного доступа к статистике.

Резюмируем

Сборщик мусора в Go — это высокооптимизированная система, сочетающая параллельную маркировку, эффективную очистку и минимизацию пауз. Он адаптируется под нагрузку и обеспечивает баланс между производительностью и использованием памяти.