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 после деплоя.