Ответ
Утечки памяти в Go чаще всего связаны с:
- Глобальными переменными - объекты в глобальной области видимости никогда не удаляются сборщиком мусора.
var cache = make(map[string]int) // Утечка, если мапа постоянно растёт
- Забытые горутины - горутины, которые зависают или работают бесконечно, удерживают ссылки на объекты.
go func() {
for { /* бесконечный цикл */ }
}()
- Срезы с большими массивами - при повторном использовании среза может оставаться ссылка на большой массив.
bigSlice := make([]byte, 1<<20) // 1MB
smallSlice := bigSlice[:10] // удерживает весь 1MB массив
-
Циклические ссылки - хотя Go умеет их обрабатывать, в некоторых случаях могут вызывать утечки.
-
CGO - ручное управление памятью через вызовы C-кода требует явного освобождения.
Для диагностики используйте pprof и runtime.ReadMemStats.