CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Node.js 运行时进阶/课时/垃圾回收
RawBlame
课时目录12 节

Node.js 运行时进阶

  1. 01运行时进阶概览
  2. 02定时器与 nextTick
  3. 03回调与错误栈
  4. 04子进程
  5. 05Worker Threads
  6. 06Cluster 与多进程
  7. 07垃圾回收
  8. 08调试 Node
  9. 09APM 与生产监控
  10. 10CLI 工具链
  11. 11global 与内置模块
  12. 12综合练习

垃圾回收

V8 GC、memory-leaks 直觉。

25 分钟

垃圾回收

Node 使用 V8 引擎管理堆内存。写长期运行的 API 或脚本时,不懂 GC 就难以解释 RSS 上涨、OOM、间歇性卡顿——本课建立直觉,衔接 nrt-apm 与 nrt-debug。

学习目标

  • 区分 heap 与 RSS、新生代与老年代(Scavenge vs Mark-Sweep)
  • 识别常见 memory leak 模式(全局缓存、闭包、事件监听未移除)
  • 使用 process.memoryUsage 与 --expose-gc 做简单观测

V8 堆结构(直觉版)

区域说明
新生代 (New Space)短生命周期对象,Scavenge 复制回收,频繁但快
老生代 (Old Space)晋升后的长生命周期对象,Mark-Sweep / Compact
大对象可能直接进老生代

Full GC 停顿主线程——大 heap 或老对象多时,可能造成 几十毫秒级卡顿(P99 尖刺)。CPU 密集 + 大量分配会加剧 GC 压力。

观测内存

const mu = process.memoryUsage();
console.log({
  rss: Math.round(mu.rss / 1024 / 1024) + " MB",
  heapUsed: Math.round(mu.heapUsed / 1024 / 1024) + " MB",
  heapTotal: Math.round(mu.heapTotal / 1024 / 1024) + " MB",
  external: Math.round(mu.external / 1024 / 1024) + " MB",
});
  • heapUsed 上涨不一定泄漏——可能是合法缓存。
  • rss 长期涨而 heap 稳定,可能是 native 内存(Buffer、C++ addon)或碎片。

开发时可 node --trace-gc app.js 看 GC 日志;生产慎用高频 trace。

常见泄漏模式

  1. 全局 Map 只增不减:按 userId 缓存响应,无 TTL/LRU。
  2. EventEmitter 重复 on 不 off:见 nva-events。
  3. 闭包持有大对象:回调引用了本可释放的 scope。
  4. Timer 未 clear:nrt-timers 里的 interval 泄漏。
  5. Detached DOM 类比:Node 里类似 未销毁的 Server/Timer/Handle 阻止进程退出。
// 反模式
const cache = new Map();
app.use((req, res, next) => {
  cache.set(req.ip, res); // 永不删除
  next();
});

修复:WeakMap(键必须是对象)、TTL、最大条目、进程外 Redis。

heap snapshot 入门

Chrome DevTools 连接 node --inspect 后可拍 Heap snapshot,对比两次快照找 Detached 或 Retained Size 增长对象——详见 nrt-debug。

命令行:node --heapsnapshot-signal=SIGUSR2 app.js(Unix)在信号触发时写快照。

与 JVM GC 对照

V8 (Node)JVM
分代新生代/老生代Eden/Survivor/Old
调优--max-old-space-size-Xmx / G1 等
泄漏排查heap snapshotMAT / JFR

练习

  • 写脚本循环 push 大数组到全局数组,观察 heapUsed 曲线
  • 修复:改为固定长度环形缓冲或 WeakRef 实验(了解即可)
  • 对 Express 路由加简单 /health 返回 memoryUsage() JSON

小结

先分清泄漏与合法缓存;用 memoryUsage 与 heap snapshot 定位 Retained 对象。 下一课 node --inspect 与调试器实战。

加载本节练习…
← 上一课Cluster 与多进程下一课 →调试 Node