Ответ
Ручное управление сборщиком мусора (GC) в Go — это крайне редкая практика, так как стандартный GC высокоэффективен и самонастраивающийся. Вмешательство требуется только в специфических сценариях.
Для этого существуют две основные функции:
runtime.GC()
— принудительно запускает цикл сборки мусора. Обычно используется для отладки или в бенчмарках, чтобы измерить производительность кода в предсказуемом состоянии памяти.debug.SetGCPercent(percent)
— динамически изменяет переменнуюGOGC
, которая определяет, при каком проценте роста кучи запускать GC. Значение100
(по умолчанию) означает, что GC запустится, когда размер кучи удвоится. Уменьшение значения делает GC более агрессивным.
import (
"runtime"
"runtime/debug"
)
func main() {
// Устанавливаем более агрессивный GC (сработает при росте кучи на 20%)
// Полезно для приложений с жесткими ограничениями по памяти.
debug.SetGCPercent(20)
// Принудительно запускаем GC.
// Например, перед началом критичной по времени операции.
runtime.GC()
}
Основные сценарии для ручного вмешательства:
- Профилирование и бенчмаркинг: Чтобы обеспечить одинаковые и воспроизводимые условия для тестов производительности.
- Приложения, критичные к задержкам (low-latency): Например, в играх или трейдинговых системах, где можно запустить GC в предсказуемый момент (например, между раундами), чтобы избежать пауз в критические моменты.
- Оптимизация долгоживущих приложений с нестандартными паттернами выделения памяти.
В подавляющем большинстве (99%+) случаев автоматическая работа GC является оптимальной и не требует вмешательства.