Что такое переменная окружения `GOGC` в Go и как она влияет на сборщик мусора?

Ответ

GOGC — это переменная окружения, которая управляет поведением сборщика мусора (Garbage Collector, GC) в Go. Она определяет, насколько должна вырасти куча (heap) перед тем, как будет запущен следующий цикл сборки мусора.

Значение GOGC задается в процентах. Формула для запуска GC выглядит так:
GC запускается, когда размер новой кучи >= размер живой кучи * (1 + GOGC / 100)

Как влияют разные значения GOGC:

  • GOGC=100 (значение по умолчанию): Сборщик мусора запускается, когда общий объем памяти в куче становится в два раза больше, чем объем "живых" данных после предыдущей сборки. Это сбалансированный вариант между использованием памяти и нагрузкой на CPU.

    • Пример: Если после сборки мусора осталось 100 МБ живых объектов, следующий GC запустится, когда размер кучи достигнет 200 МБ.
  • GOGC < 100: Сборщик мусора будет запускаться чаще. Это приводит к меньшему пиковому потреблению памяти, но увеличивает нагрузку на CPU из-за частых пауз на GC.

    • Пример (GOGC=50): GC запустится, когда размер кучи достигнет 150 МБ.

  • GOGC > 100: Сборщик мусора будет запускаться реже. Это снижает нагрузку на CPU, но увеличивает пиковое потребление памяти.



  • GOGC=off: Полностью отключает сборку мусора. Используется крайне редко, в основном для отладки или в короткоживущих программах, где потребление памяти не является проблемой.


Когда это может быть полезно?

Тюнинг GOGC полезен для оптимизации производительности приложения под конкретные задачи:

  1. Для приложений с ограниченной памятью (например, в контейнерах): Можно установить GOGC в меньшее значение, чтобы экономить память.
  2. Для CPU-bound приложений, где паузы GC критичны: Можно увеличить GOGC, чтобы GC запускался реже, ценой большего расхода памяти.