C чем могут быть связаны утечки памяти

«C чем могут быть связаны утечки памяти» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Утечки памяти в Go чаще всего связаны с:

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

  2. CGO - ручное управление памятью через вызовы C-кода требует явного освобождения.

Для диагностики используйте pprof и runtime.ReadMemStats.