服务跑一周内存从 200M 涨到 1.5G,重启就好。

排查:

  • heapdump 抓快照对比,看到大量闭包对象
  • 顺着引用链找到是 EventEmitter 的监听器堆积

原因:每次请求都给全局 emitter 加监听,但从不解绑。请求量大了就堆积。

解法:

  1. 用完 removeListener
  2. 或者用 once 而不是 on
  3. 或者每个请求用独立的 emitter

另外加了监控:定期打印 listenerCount,超过阈值报警。

这类问题在长连接、轮询、WebSocket 场景特别常见。

主楼