这一小节是全章最实战的部分,朴灵作者教你如何监控Node进程内存、发现泄漏、定位根源。读完这一节,你就能像医生一样“诊断”内存问题,线上服务再也不怕悄无声息地涨到OOM了。
5.3.1 查看内存指标
Node提供了内置API查看实时内存使用:
console.log(process.memoryUsage());
返回对象(单位字节):
- rss(Resident Set Size):进程常驻内存(包括堆、栈、代码段等)。
- heapTotal:V8分配的堆内存总量。
- heapUsed:实际使用的堆内存(最关键,常用来判断泄漏)。
- external:C++对象、Buffer等占用的内存。
- arrayBuffers(现代Node新增):ArrayBuffer等。
示例输出:
{
rss: 49356800,
heapTotal: 18268160,
heapUsed: 6506408,
external: 49879,
arrayBuffers: 9898
}
监控技巧:
- 定时打印(setInterval)观察趋势。
- 用工具可视化(后面会讲)。
5.3.2 内存泄漏排查工具与方法
作者列出了几种常用手段(2013年时经典,现在2025年更强大,但原理一样):
-
heapdump / node-heapdump
- 生成堆快照(snapshot)。
require('heapdump'); // 安装后 // 手动触发:kill -USR2 <pid>- 用Chrome DevTools打开快照,对比多次快照看哪些对象增长。
-
node-inspector / Chrome DevTools
- 直接连接Node进程(--inspect)。
- Memory面板:拿堆快照、查看分配时间线、记录Allocation instrumentation。
-
v8-profiler / node-tick-processor
- 分析CPU和内存热点。
-
线上监控工具
- PM2、阿里云、Datadog等监控heapUsed曲线。
- 报警阈值(如heapUsed > 80%)。
排查步骤(作者总结的经典流程)
- 发现问题:内存持续上升、GC频繁、响应变慢。
- 监控趋势:process.memoryUsage() 定时日志。
- 生成快照:压力测试下多拿几次heap snapshot。
- 对比分析:
- 看哪些对象数量增长(Constructors视图)。
- 找Retained Size大的对象(被谁引用)。
- 查引用链(为什么没回收)。
- 定位代码:结合源码修复(清除缓存、移除监听等)。