Sobes.tech
Назад к вопросам
Senior
4

Как намеренно добиться утечки памяти в Go? Какие кейсы приводят к утечкам?

Компании, где спрашивали
А7

Ответ от нейросети

sobes.tech AI

В Go утечки памяти обычно происходят, когда объекты остаются доступны для сборщика мусора, хотя они больше не нужны, из-за неправильного управления ссылками.

Как намеренно добиться утечки памяти:

  • Глобальные переменные или срезы, в которые постоянно добавляются элементы, но не удаляются.
  • Замыкания, которые захватывают ссылки на большие объекты, не освобождая их.
  • Кэширование без ограничения размера, например, map, куда добавляются данные, но не очищаются.

Пример утечки через срез, который постоянно растёт:

var leakedData [][]byte

func leak() {
    data := make([]byte, 1024*1024) // 1MB
    leakedData = append(leakedData, data)
}

func main() {
    for {
        leak()
        time.Sleep(time.Second)
    }
}

Кейсы, приводящие к утечкам:

  • Длительное хранение ссылок на объекты, которые уже не нужны.
  • Использование каналов без закрытия, что может блокировать горутины.
  • Ошибки в логике, когда объекты добавляются в структуры данных и не удаляются.

Важно помнить, что Go имеет сборщик мусора, но он не освобождает память, если на неё ещё есть ссылки.