Назад к вопросам
СБЕР
Middle
2
Что такое утечка памяти? Как обнаружил и устранил утечку в WebSocket Hub через pprof?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Утечка памяти — это ситуация, когда программа продолжает занимать память, которая больше не нужна, но не освобождает её, что приводит к росту потребления памяти и возможному сбою.
В случае WebSocket Hub на Go с помощью pprof можно обнаружить утечку следующим образом:
- Подключить
net/http/pprofи запустить HTTP-сервер для профилирования. - Снять heap-профиль памяти в разное время и сравнить.
- Использовать
go tool pprofдля анализа, выявляя объекты, которые не освобождаются.
Например, если в Hub хранится карта клиентов, и при отключении клиента ссылка на него не удаляется, память не освобождается.
Для устранения нужно:
- Проверить логику удаления клиентов из структуры Hub при закрытии соединения.
- Убедиться, что все каналы и горутины корректно завершаются.
- Добавить тесты и мониторинг памяти.
Пример удаления клиента из Hub:
func (h *Hub) unregisterClient(client *Client) {
delete(h.clients, client)
close(client.send)
}
Таким образом, регулярный анализ с pprof и внимательное управление жизненным циклом объектов помогает выявлять и устранять утечки памяти.