> Как выявлять и исправлять утечки памяти (JavaScript)

Уровень: senior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы

Компании: ЭНИРАН

Стек: Node.js, JavaScript

> Пример ответа

Утечки памяти в Node.js чаще всего возникают из-за глобальных переменных, забытых таймеров, неочищенных слушателей событий или замыканий, удерживающих ссылки на большие объекты. Для выявления я использую комбинацию инструментов:

  1. Встроенный профайлер Node.js - запускаю приложение с флагом --inspect, затем в Chrome DevTools (вкладка Memory) делаю снимки кучи (Heap Snapshots) до и после выполнения подозрительного сценария. Сравниваю, какие объекты не освобождаются.

  2. clinic.js - утилита clinic doctor автоматически анализирует утечки, показывая графики памяти и события GC.

  3. heapdump - модуль для создания дампов памяти в production-режиме без остановки процесса.

Исправляю так:

  • Слушатели событий: всегда удаляю через removeListener или использую once для одноразовых событий. В React-фронтенде - отписываюсь в useEffect cleanup.

  • Таймеры: сохраняю идентификаторы setInterval/setTimeout и очищаю их при завершении работы компонента или модуля.

  • Замыкания: избегаю хранения больших данных в замыканиях, которые живут дольше, чем нужно. Использую слабые ссылки (WeakMap, WeakSet) для кэшей.

  • Глобальные переменные: минимизирую их использование, а если нужны - явно обнуляю (global.cache = null).

Пример кода для отладки:

JAVASCRIPT
const heapdump = require('heapdump');
setInterval(() => {
global.gc(); // принудительный GC (нужен флаг --expose-gc)
heapdump.writeSnapshot(`/tmp/heap-${Date.now()}.heapsnapshot`);
}, 60000);

После исправления проверяю, что размер кучи стабилизируется и не растёт бесконечно при длительной работе.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью