Ответ
Уменьшение частоты вызовов сборщика мусора (GC) — это компромисс между производительностью и использованием памяти. Это достигается через переменную окружения GOGC
или функцию debug.SetGCPercent()
.
Плюсы (когда GC вызывается реже):
- Увеличение пропускной способности (Throughput): Приложение тратит меньше процессорного времени на сборку мусора и больше — на выполнение полезной работы. Это особенно заметно в CPU-bound задачах.
- Снижение 'Stop-The-World' пауз: Поскольку GC запускается реже, общее количество пауз в работе приложения уменьшается, что может быть полезно для пакетных обработок (batch jobs).
Минусы (когда GC вызывается реже):
- Повышенное потребление памяти: Объекты, которые уже не нужны, дольше остаются в памяти, увеличивая общий размер кучи (heap).
- Риск ошибки
Out Of Memory
(OOM): При значительном увеличении потребления памяти приложение может исчерпать доступные ресурсы и аварийно завершиться. - Более длительные паузы GC: Когда сборка мусора все же запускается, ей приходится обрабатывать больший объем объектов, что приводит к более длительным 'Stop-The-World' паузам. Это критически плохо для систем с низкими требованиями к задержке (low-latency).
Как управлять частотой GC:
Основной способ — переменная окружения GOGC
. По умолчанию GOGC=100
.
GOGC=100
(по умолчанию): новая сборка мусора начнется, когда размер кучи достигнет 200% от размера живых объектов после предыдущей сборки (т.е. удвоится).GOGC=200
: сборка начнется, когда размер кучи достигнет 300% (т.е. утроится). Это сделает вызовы GC реже.GOGC=off
: полностью отключает GC.
Пример программной настройки:
import "runtime/debug"
func main() {
// Устанавливаем GOGC=200, чтобы GC запускался реже
debug.SetGCPercent(200)
// ...
}
Вывод: Редкая сборка мусора подходит для задач, где важна максимальная пропускная способность и допустимо высокое потребление памяти. Для интерактивных сервисов, где важна низкая задержка ответа, предпочтительны более частые, но короткие циклы GC.