标准答案

  1. 观察 heapUsed、external、arrayBuffers、RSS、GC 后基线和请求流量的关系。
  2. 多次在相似负载后获取快照,比较增长对象、构造函数和 retaining path。
  3. 重点检查全局 Map、模块缓存、事件监听器、定时器、闭包、未结束请求和无界队列。
  4. 取证和修复要控制生产影响,先限流或重启止血,再通过回归压测确认基线稳定。

题目解析

Node 内存问题要先分层:heapUsed/heapTotal 反映 V8 堆,external 和 arrayBuffers 反映部分外部 Buffer,RSS 还包含 native、线程栈和映射。只看 heapUsed 会漏掉大量文件或网络缓冲。

多次在相似流量和 GC 后比较 heap snapshot,观察构造函数、对象数量、retaining path、监听器、定时器、连接和队列。一次快照或一次 RSS 高峰不能证明泄漏。

重启可以止血但不会解释创建路径。修复后要用回归压测验证 GC 后基线、P99、队列、连接和 RSS 不再持续增长,并控制取证文件的敏感数据。

常见误区

  • 误区:只看 heapUsed。改正:同时看 external、arrayBuffers、RSS、FD、连接和队列。
  • 误区:每次请求创建无法移除的 listener。改正:使用 once/明确 removeListener,并在请求结束时清理闭包引用。
  • 误区:把重启后的暂时下降当作修复完成。改正:重复流量和快照对比,验证增长基线是否真正稳定。

作者信息