Ответ
Частота сборки мусора (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 МБ
}
}
Таким образом, чем интенсивнее программа выделяет память, тем чаще происходит сборка мусора.