5.3 内存指标查看与泄漏排查

45 阅读2分钟

这一小节是全章最实战的部分,朴灵作者教你如何监控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年更强大,但原理一样):

  1. heapdump / node-heapdump

    • 生成堆快照(snapshot)。
    require('heapdump');  // 安装后
    // 手动触发:kill -USR2 <pid>
    
    • 用Chrome DevTools打开快照,对比多次快照看哪些对象增长。
  2. node-inspector / Chrome DevTools

    • 直接连接Node进程(--inspect)。
    • Memory面板:拿堆快照、查看分配时间线、记录Allocation instrumentation。
  3. v8-profiler / node-tick-processor

    • 分析CPU和内存热点。
  4. 线上监控工具

    • PM2、阿里云、Datadog等监控heapUsed曲线。
    • 报警阈值(如heapUsed > 80%)。

排查步骤(作者总结的经典流程)

  1. 发现问题:内存持续上升、GC频繁、响应变慢。
  2. 监控趋势:process.memoryUsage() 定时日志。
  3. 生成快照:压力测试下多拿几次heap snapshot。
  4. 对比分析
    • 看哪些对象数量增长(Constructors视图)。
    • 找Retained Size大的对象(被谁引用)。
    • 查引用链(为什么没回收)。
  5. 定位代码:结合源码修复(清除缓存、移除监听等)。