Node.js LinuxWindowsNode.js

Node.js: Как выявить утечку памяти в процессе Node.js

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Подозрение на утечку памяти в Node.js возникает, если процесс после одинаковых нагрузочных циклов всё больше потребляет память. Нужно сравнивать heapUsed, external и rss, а не ориентироваться только на один график ОЗУ.

В этой статье
  1. Симптомы и условия возникновения
  2. Причины и как их отличить
  3. Пошаговая диагностика и решение
  4. Как проверить результат и что делать, если не помогло

#Симптомы и условия возникновения

Подозрение на утечку памяти в Node.js возникает, если процесс после одинаковых нагрузочных циклов всё больше потребляет память. Нужно сравнивать heapUsed, external и rss, а не ориентироваться только на один график ОЗУ. Для начала проверьте используемую версию среды и точный текст ошибки на копии проекта, не меняя рабочий сервер.

#Причины и как их отличить

Возможная причинаКак узнатьЧто делать
Удерживаются объекты JavaScriptВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление.Рост heapUsed после повторных одинаковых цикловСравнить heap snapshot и пути удержания объектов.
Накапливаются Buffer/нативные объектыВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление.RSS/external растут быстрее heapUsedПосмотреть буферы, потоки, нативные зависимости.
Кэш ожидаемо разогреваетсяВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление.Память повышается и стабилизируетсяСравнить длинный период, не объявлять нормальный кэш утечкой.

#Пошаговая диагностика и решение

  1. 1. Составьте воспроизводимый тестСоздайте копию приложения без персональных данных и одинаковый сценарий запросов из нескольких циклов. Выберите интервалы покоя между ними; разная нагрузка делает вывод об утечке ненадёжным.
  1. 2. Начните с малого — измерений памятиДобавьте process.memoryUsage() в журнал тестового процесса раз в минуту и посмотрите heapUsed, rss, external. Без контекста нагрузки отдельное число не доказывает утечку.
  1. 3. Проверьте кэши и подпискиПоиск по проекту: Map, Set, массивы, setInterval, .on(. Убедитесь, что удаляются старые записи, обрабатываются close/end, а listeners не добавляются при каждом запросе без снятия.
  1. 4. Сделайте два снимка кучи на тестовой копииЧерез node --inspect подключите Chrome DevTools только к локальной среде, откройте Memory и снимите Heap snapshot после стабилизации и после нескольких одинаковых циклов. Снимки могут быть крупными и содержать секреты.
  1. 5. Найдите удерживающие ссылкиВ сравнении снимков сортируйте по росту retained size, исследуйте retainers — например, глобальный Map или неочищенный closure. Нельзя полагаться только на число объектов без контекста сборки мусора.
  1. 6. Исправьте жизненный цикл обнаруженных объектовДобавьте срок хранения и предел размера кэша, снимайте слушатели, закрывайте потоки, устраняйте очереди без ограничений. Для подозрения на нативный пакет используйте поддерживаемые диагностические средства его разработчика.
  1. 7. Проверьте до длительного развёртыванияПовторите точно такой же тест на исправленном коде, сравните кривые памяти и частоту сборок. Если рост сохраняется, верните код и расширьте диагностический набор, не повышая лимит кучи бесконечно.

#Как проверить результат и что делать, если не помогло

После повторных одинаковых циклов память выходит на устойчивый диапазон либо обоснованно освобождается; у приложения нет новых ошибок OOM и просадки пропускной способности.

Если неисправность повторилась, выпишите первый код ошибки и действие, на котором она возвращается. Сравните версию Node.js/npm, рабочий каталог, настройки процесса и журнал тестового запуска. Откатите только внесённые изменения из предварительно сохранённой копии, затем разберите причину на отдельной среде.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.