Sobes.tech
Назад к вопросам
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 и внимательное управление жизненным циклом объектов помогает выявлять и устранять утечки памяти.