AceDevHub
Intermediate Node.js Interview QuestionsIntermediateConcept

Node.js · Question 57

How do EventEmitter memory leaks happen in Node.js?

Direct answer

Leaks occur when listeners are added repeatedly without removal — setMaxListeners warns at 10 by default; fix with off/removeListener, once, or WeakRef patterns; hot-reload and long-lived servers are common culprits.

Each on() keeps a closure alive referencing outer scope — duplicate subscriptions on every request without cleanup accumulate until MaxListenersExceededWarning and OOM.

Why interviewers ask

  1. Repeated subscribe — db.on('connect') inside handler instead of once at startup.
  2. Missing cleanup — WebSocket close should removeListener on shared emitter.
  3. setMaxListeners — raise only when legitimately many listeners; not a fix for leaks.
  4. process warnings — MaxListenersExceededWarning signals investigation.
emitter-leak-fix.mjs
import { EventEmitter } from "node:events";

const bus = new EventEmitter();

function subscribeOnce(jobId, handler) {
  const wrapped = (payload) => {
    if (payload.jobId === jobId) {
      bus.off("progress", wrapped);
      handler(payload);
    }
  };
  bus.on("progress", wrapped);
}

// Anti-pattern: every request adds permanent listener
// function bad(req, res) {
//   bus.on("progress", () => res.write("...")); // leak
// }