Garbage collector

Тема дорожной карты · Golang

Сборщик мусора Go — конкурентный трёхцветный маркировочно-очищающий GC, работающий преимущественно параллельно с goroutines приложения и удерживающий паузы stop-the-world менее одной миллисекунды для большинства нагрузок. GC настраивается через переменную окружения GOGC, задающую коэффициент роста кучи, при котором запускается цикл сборки, — значение по умолчанию 100 означает, что новый цикл начинается, когда живая куча удваивается; уменьшение этого значения снижает пиковое потребление памяти ценой более частых сборок. В Go 1.19 появился GOMEMLIMIT (через runtime/debug.SetMemoryLimit), позволяющий ограничить общий размер кучи и предотвратить OOM-убийства в контейнеризованных Golang-сервисах, работающих в Kubernetes с жёсткими ограничениями памяти. Разработчики могут наблюдать поведение GC с помощью GODEBUG=gctrace=1, профилировать выделения через go tool pprof по heap-профилю (runtime/pprof.WriteHeapProfile) и снижать GC-нагрузку через escape-анализ, sync.Pool для повторного использования объектов и осторожные преобразования []byte в string. Понимание сборщика мусора Go необходимо для создания высоконагруженных сервисов с требованиями к стабильной задержке — в особенности gRPC-серверов, HTTP API и потоковых конвейеров.

Как это работает

Garbage collector использует pprof (CPU, memory, goroutine, block, mutex-профили), бенчмарки (go test -bench=.), trace-инструмент (go test -trace=trace.out + go tool trace), execution tracer для scheduling goroutines. -race-детектор для race conditions. Обычные победы: меньше аллокаций (sync.Pool, []byte slices, value-типы), избегать reflection в горячих путях, strings.Builder для конкатенации, профайл до оптимизации.

Когда применять

Всегда профайл до оптимизации — Go's pprof встроен и дружелюбен. pprof.StartCPUProfile в production за net/http/pprof (admin-эндпойнт, IP-restricted). Меньше аллокаций — обычно главная победа; вывод escape analysis (go build -gcflags="-m") показывает, что аллоцирует на heap vs stack.

Типичные ошибки

Ловушки Garbage collector: микрооптимизация без замеров (Go-компилятор умный, преждевременная оптимизация часто вредит); sync.Pool для объектов, создаваемых раз на запрос (overhead pool > выгоды на низких rate); тюнинг GOGC по интуиции, не по бенчмарку (дефолт 100 обычно ок).

Связанные понятия

Полезные ресурсы