Как найти утечку памяти в Node.js-приложении?
Производительность и production
Утечка памяти — объекты остаются достижимыми и не собираются сборщиком мусора, поэтому память процесса растёт без остановки.
Типичные источники
- Глобальные кеши и Map без ограничения размера и срока жизни.
- Забытые подписчики
EventEmitterи таймеры. - Замыкания, которые держат большие объекты.
- Накопление данных в массивах-логах или очередях.
Как искать
- Посмотреть динамику:
process.memoryUsage().heapUsedи метрики RSS в мониторинге. - Запустить с
--inspectи подключить Chrome DevTools. - Снять два-три снимка кучи (Heap Snapshot) с интервалом и сравнить: смотреть, какие объекты прибавляют.
- Включить сравнение «Allocation instrumentation on timeline».
- В production можно получить снимок по сигналу:
node --heapsnapshot-signal=SIGUSR2.
const cache = new Map();
function remember(key, value) {
cache.set(key, value);
if (cache.size > 1000) cache.delete(cache.keys().next().value); // ограничение размера
}Коротко для собеседования
Сравниваем снимки кучи во времени и ищем растущие объекты. Лечим ограничением кешей, отпиской от событий и очисткой таймеров.