吴桥县做网站,腾讯云注册域名dnspod,吸引人的网站类型,ue4培训Node.js 中的 老生代#xff08;Old Generation#xff09; 和 新生代#xff08;New Generation#xff09;#xff0c;是指其运行的 V8 引擎内部管理 JavaScript 堆内存时使用的分代垃圾回收机制中的两个重要概念。理解这两代内存的作用#xff0c;有助于深入理解 Node…Node.js 中的 老生代Old Generation 和 新生代New Generation是指其运行的 V8 引擎内部管理 JavaScript 堆内存时使用的分代垃圾回收机制中的两个重要概念。理解这两代内存的作用有助于深入理解 Node.js 的内存管理和垃圾回收行为。 1. 背景什么是分代垃圾回收Generational GC
V8 引擎采用 分代垃圾回收策略将堆内存分成不同的区域代主要基于“对象存活时间”的假设 绝大多数对象生命周期很短马上就会被回收 少数对象会存活较长时间
为了提升效率V8 把堆分成两个主要区域 新生代New Generation用于存放新创建的对象 老生代Old Generation用于存放存活时间较长的对象 2. 新生代New Generation 也叫“年轻代”或“新生代堆” 内存较小存储刚刚创建的对象 新生代的垃圾回收称为 Scavenge 或 Minor GC GC 频率高但耗时短 对象如果在新生代经过一定次数的垃圾回收仍未被回收就会被晋升到老生代
特点 小回收快频繁 适合回收生命周期短的对象 分为两个半区From Space 和 To Space复制算法实现回收 3. 老生代Old Generation 又称“长生代”或“老生代堆” 用来存放经过多次新生代 GC 后仍然存活的对象 堆空间较大 老生代的垃圾回收称为 Mark-Sweep 或 Mark-CompactMajor GC GC 频率低耗时相对长 负责回收生命周期长的对象
特点 较大回收较少但耗时较长 使用标记-清除和标记-整理算法进行回收 老生代满了会触发全堆垃圾回收Full GC对性能影响较大 4. 简单类比 新生代像是一个“缓冲区”新来的对象先在这里呆着经过几轮“考验”没被清理掉就晋升到老生代。 老生代则像是“持久区”存放那些经过验证存活时间长的对象。 5. Node.js 内存中的代际内存
Node.js 作为 V8 的宿主内存管理同样遵循上述分代机制 当你的 Node.js 程序创建大量临时对象时这些对象首先在新生代分配频繁被垃圾回收释放。 持久引用的对象如全局变量、长时间保持的缓存对象会被晋升到老生代。 老生代内存增长过快会导致较慢且影响性能的全堆垃圾回收。 6. 为什么分代GC对性能很重要 快速回收新生代减少暂停时间因为新生代的GC非常快减少对程序执行的影响。 减少对老生代的垃圾回收压力通过合理晋升和回收策略避免频繁耗时的全堆回收。 7. 你可以怎么用 可以通过启动参数调整堆大小和新生代大小影响性能和内存占用
node --max-old-space-size2048 yourApp.js # 最大老生代堆大小单位MB
node --max-semi-space-size16 yourApp.js # 新生代空间大小单位MB不是所有版本都支持通过 process.memoryUsage() 查看 heapUsed 和 heapTotal但要深入查看新生代和老生代大小可以用 Chrome DevTools 或 v8 模块。 8. 总结
方面新生代 (New Generation)老生代 (Old Generation)作用存放新创建的短命对象存放存活时间长的对象大小小大GC 类型Scavenge (Minor GC)Mark-Sweep/Mark-Compact (Major GC)GC 频率高低GC 耗时短长性能影响小大 如果你想我还能帮你讲讲 V8 的垃圾回收算法具体实现、如何诊断内存泄漏以及调优技巧需要吗 二、Scavenge 和Mark-Sweep详细讲解
我们现在详细讲解一下 V8 引擎在 Node.js 中常用的两种垃圾回收算法 ✅ Scavenge清除式回收 —— 用于 新生代New Generation ✅ Mark-Sweep标记-清除 —— 用于 老生代Old Generation 一、Scavenge 算法清除式 GC用于新生代 背景
新生代空间小GC 频繁因此需要一种 快速且高效 的垃圾回收算法。Scavenge 是一种基于 复制算法Copying GC 的实现它将新生代内存划分为两块区域。 工作原理 新生代被划分为两个半区semi-spaceFrom Space 和 To Space。 对象先被分配到 From Space。 当 GC 被触发时 扫描 From Space 中仍然“存活”的对象。 把活着的对象 复制到 To Space。 然后清空 From Space。 完成后From 和 To 的角色对调。 新生代 (New Gen)----------------------| From | To |----------------------| 活对象 | 空白 | -- 回收后 From、To 对调晋升Promotion
当一个对象在新生代中 经历过多次 GC 仍然存活或 To 空间不足以容纳它时它就会被晋升到老生代。
✅ 优点 回收快适合小对象。 对短命对象非常高效。
❌ 缺点 要使用 两倍空间。 不适合回收大量长生命周期对象。 二、Mark-Sweep 算法标记-清除 GC用于老生代 背景
老生代内存大对象生命周期长不能频繁复制。适合使用更精细的垃圾回收算法。 工作原理 Mark标记阶段 遍历对象图标记出仍然“可达”的对象可通过 GC Root 找到。 这些可达对象被打上“存活”的标记。 Sweep清除阶段 扫描整个堆回收那些未被标记的对象。 不会整理内存碎片。 内存块: [Obj1] [X] [Obj2] [X] [X] [Obj3]标记后: ✓ ✗ ✓ ✗ ✗ ✓清除后: [Obj1] [ ] [Obj2] [ ] [ ] [Obj3]可能引发的问题
由于只清除内存没有整理碎片会造成内存碎片fragmentation。 三、Mark-Compact标记-整理
为了解决 Mark-Sweep 带来的内存碎片问题V8 在需要时使用 Mark-Compact标记-压缩 算法。 原理 先标记 然后将所有存活对象往一边移动整理出连续的空闲内存块 清除前: [Obj1] [X] [Obj2] [X] [Obj3]压缩后: [Obj1] [Obj2] [Obj3] [ ] [ ]❗ 这是耗时最高的回收方式用于内存整理。 四、对比总结
特性/算法Scavenge复制Mark-Sweep老生代Mark-Compact整理应用区域新生代老生代老生代内存碎片多时触发时间复杂度快速 O(n)较慢 O(n)最慢 O(n)带移动成本内存碎片无有无空间需求高需要双倍空间低低对象处理方式存活对象复制到另一块区域删除不可达对象删除不可达对象 整理存活对象 五、如何查看 Node.js 垃圾回收情况
你可以通过下面的方式查看
node --trace-gc app.js输出示例
[GC: scavenge 1.0 (1.2) - 0.7 (1.0) MB, 0.2 ms]
[GC: mark-sweep 10.2 (20.0) - 5.0 (10.0) MB, 12 ms]六、结语
这两种算法配合使用构成了 V8 引擎的高性能垃圾回收机制 Scavenge 快速回收短命对象 Mark-Sweep / Mark-Compact 处理长生命周期对象
这样不仅节省资源还保持执行效率。 如果你想我还可以讲 如何用 Chrome DevTools 分析 Node.js 内存快照 Node.js 中的内存泄漏调试方式 --inspect 的 GC 监控技巧
是否继续深入