Как можно управлять сборщиком мусора (Garbage Collector) в Go?

Ответ

Да, на работу GC можно влиять, но это следует делать с осторожностью и только после профилирования. Go GC хорошо оптимизирован для большинства сценариев.

Основные способы управления:

  1. Настройка порога запуска (GOGC) Это переменная окружения, которая определяет, при каком проценте роста кучи (heap) относительно её размера после прошлой сборки запустится новый цикл GC. Значение по умолчанию — 100.

    # GC запустится, когда размер кучи достигнет 150% от предыдущего (рост на 50%)
    GOGC=50 go run main.go
    
    # Полностью отключить GC (не рекомендуется для продакшена)
    GOGC=off go run main.go
  2. Принудительный вызов GC Можно запустить сборку мусора вручную. Это блокирующая операция, которую стоит использовать только в исключительных случаях, например, после освобождения большого объёма памяти перед возвратом воркера в пул.

    import "runtime"
    
    runtime.GC()
  3. Динамическое изменение GOGC Можно изменять порог GC прямо во время выполнения программы с помощью пакета runtime/debug.

    import "runtime/debug"
    
    // Отключает GC. Возвращает предыдущее значение.
    oldPercent := debug.SetGCPercent(-1)
  4. Профилирование и анализ Лучший способ оптимизации — это не тюнинг GC, а уменьшение количества аллокаций в коде. Используйте pprof для анализа использования памяти.

    import _ "net/http/pprof"
    
    // Анализ профиля кучи:
    // go tool pprof http://localhost:6060/debug/pprof/heap

Важно: Вмешательство в работу GC оправдано только для приложений с жёсткими требованиями к задержкам (low-latency) или при работе в средах с крайне ограниченной памятью. Всегда начинайте с профилирования, а не с изменения настроек GC.