跳到主要内容

memory-gc

V8 内存与 GC(Node 视角)

理解新生代/老生代与写屏障、调参与泄漏排查;服务端场景需结合长期运行与负载特性。

要点

  • 新生代/老生代大小与 --max-old-space-size
  • 隐藏类/IC 对性能影响;
  • 常见泄漏源:全局引用、缓存未清理、事件监听未移除;
  • 参考:JavaScript 章节的V8 内存与垃圾回收

示例:模拟内存泄漏与定位

// 慎用:演示泄漏
const leaks = [];
setInterval(() => leaks.push(Buffer.alloc(1e6)), 100); // 每 100ms 增长 1MB

排查:

  • 运行 node --inspect --expose-gc app.js,在 DevTools 采集多份堆快照对比;
  • 监控 Full GC 次数/耗时与事件循环延迟;
  • 结合对象保留路径(Retainers)找到全局引用或缓存未清理。

常用参数

  • --max-old-space-size=4096 调整老生代上限;
  • --trace-gc --trace-gc-verbose 观察 GC 行为(生产慎用);
  • 避免大对象长时间存活,批量释放可降低晋升压力。