Pull to refresh

Comments 4

Спасибо за интересную статью, как раз с товарищем получили задачу на "проверить утекает ли память".
Будем искать. (с)

Можете пояснить, как именно возникает утечка памяти в примере из раздела Пример кода с утечкой, где не закрыли http reponse body?
Там resp - локальная переменная, в замыканиях не участвует. Почему GC не сможет её собрать после выхода из HTTP-обработчика?

В комментарии к Body я вижу упоминание про возможное "утекание" TCP-соединений, но где тут утекает память?

В этом случае мы получаем именно утечку горутин. Вы можете это увидеть в профиле горутин Профиль горутин этой программы после нескольких запросов к эндпоинту. Почему при утечке горутин утекает память? Потому что При утечки горутины утекают также переменные, которые находятся в области ее видимости. Кроме того, стек горутины выделяется в куче.

Касательно локальной переменной resp. С ней нет никаких проблем. Это локальная переменная, которая "не переживет" свою функцию.

Проблема в этом примере не в том, что у нас не может завершиться обработчик http запроса func(writer http.ResponseWriter, request *http.Request). А в http.DefaultClient. http.Get под капотом использует именно его. У этого клиента есть пул коннектов, который будет расти при каждом запросе к нашему http обработчику func(writer http.ResponseWriter, request *http.Request).

Вот что нам говорит официальная документация про закрытие Body - It is the caller's responsibility to close Body. The default HTTP client's Transport may not reuse HTTP/1.x "keep-alive" TCP connections if the Body is not read to completion and closed.

Если абстрагироваться, то я думаю можно представить себе пул коннектов как глобальный объект, в котором на каждый http вызов создается коннект (запускается горутина). В том момент, когда http клиент получает ответ и не закрывает body, коннект не может вернуться в пул и быть переиспользован (горутина не завершается). В дальнейшем при новом запросе будет создан новый коннект в пуле коннектов (запущена горутина). В результате в профиле мы видим утекающие горутины, что и приводит к утечкам памяти.

Sign up to leave a comment.

Articles