Назад к вопросам
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 имеет сборщик мусора, но он не освобождает память, если на неё ещё есть ссылки.