Skip to content

EventEmitter listeners

EventEmitter stores listeners in an internal array. Each listener is a root until removed.

examples/node/02-event-emitter-leak.js:

import { EventEmitter } from 'node:events';
const bus = new EventEmitter();
setInterval(() => {
const payload = new Array(50_000).fill(0);
bus.on('job', () => void payload.length);
bus.emit('job');
}, 400);

Every tick adds another listener — memory and CPU grow.

examples/node/02-event-emitter-fixed.jsonce, removeListener, or reuse one handler.

Terminal window
node examples/node/02-event-emitter-leak.js
node examples/node/02-event-emitter-fixed.js

Node warns: MaxListenersExceededWarning — treat as a leak smell.

flowchart LR
  emitter[EventEmitter]
  l1[listener + closure]
  l2[listener + closure]
  ln[listener N...]
  emitter --> l1
  emitter --> l2
  emitter --> ln