От чего зависит частота запуска сборщика мусора (GC) в Go?

Ответ

Частота сборки мусора (GC) в Go не привязана к фиксированным временным интервалам. Она определяется темпом выделения памяти в приложении.

Ключевое правило: новый цикл GC запускается, когда объем вновь выделенной в куче (heap) памяти достигает определенного порога. Этот порог по умолчанию равен 100% от объема живой (используемой) памяти, которая осталась после предыдущей сборки.

Этим поведением управляет переменная окружения GOGC (по умолчанию 100).

Пример:

  • После сборки мусора в куче осталось 4 МБ живых данных.
  • При GOGC=100 (по умолчанию), следующий GC запустится, когда приложение выделит еще 4 МБ новой памяти.
  • Если установить GOGC=50, GC запустится после выделения 2 МБ.
  • Если GOGC=200, GC запустится после выделения 8 МБ.
// В этом цикле память выделяется очень интенсивно.
// GC будет запускаться многократно прямо во время его выполнения,
// как только объем новой памяти будет достигать порога GOGC.
func allocateMemory() {
    var data [][]byte
    for i := 0; i < 1000; i++ {
        data = append(data, make([]byte, 1024*1024)) // Выделяем по 1 МБ
    }
}

Таким образом, чем интенсивнее программа выделяет память, тем чаще происходит сборка мусора.