advanced
Memory leaks
Находите retained references из caches, listeners, timers, closures, global maps, request state и unbounded queues.
«Утечка» в Node — обычно неограниченное удержание: объекты достижимы через забытые ссылки. RSS растёт до OOM.
Частые удержатели:
- Глобальные Map без TTL на user/request
- Слушатели без `off`/`removeListener`
- Замыкания с большим контекстом запроса
- Таймеры и interval
- Неограниченные очереди
const cache = new Map();
app.use((req, res, next) => {
cache.set(req.user.id, heavyObject(req));
next();
});
Диагностика: два heap snapshot под нагрузкой — сравнение retained size. Лечение: WeakMap для эфемерных ключей, TTL, снятие слушателей, очистка таймеров при shutdown.
На интервью: достижимость в GC; пример listener leak; как доказали фикс в staging.
Типовые ошибки: путать рост heap с утечкой; только `--max-old-space-size`.
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Ограничьте каждый кэш.
- Снимайте слушатели по lifecycle.
- Методика diff snapshot.
- Тренд heap после деплоя.