Может ли произойти утечки памяти в Golang

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

Ответ

Да, утечки памяти возможны даже в Go, несмотря на сборщик мусора (GC). Основные причины:

  1. Глобальные переменные – объекты в них никогда не удаляются:
var cache = make(map[string]interface{}) // Утечка, если map растёт бесконтрольно
  1. Горутины – зависшие горутины удерживают ссылки:
go func() {
    for { /* бесконечный цикл */ }
}() // Утечка, если горутина не завершается
  1. Срезы – удержание ссылки на базовый массив:
bigData := make([]byte, 1<<30) // 1GB
smallSlice := bigData[:10] // Удерживает весь 1GB массив
  1. CGO – ручное управление памятью через C-код.

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