你了解 Node.js 的垃圾回收机制吗?
Node.js 中 V8 引擎使用分代回收模型进行垃圾回收。该机制将内存划分为新生代和老生代,采用 Scavenge 和 Mark-Sweep 算法。
V8 引擎的垃圾回收机制自动管理内存释放与回收,核心基于分代回收模型。它将堆内存划分为新生代和老生代两个区域,具体流程如下:
- 分代与假说:
- 新生代 (New Space) 存储短期存活的新建对象,如新创建的变量。
- 老生代 (Old Space) 存储长期存活的对象。
- 理论基础是大多数对象快速消失。
- 新生代回收(Scavenge 算法):
- 使用 From 和 To 两个等大空间。对象先在 From 空间分配,当回收触发时:
- 检测活对象(可达自根对象)。
- 复制活对象到 To 空间,非活动对象释放。
- 空间角色互换(From / To 互调)。
- 晋升条件:
- 对象经多次 Scavenge 回收后仍存活(自动晋升)。
- To 空间使用量超 25%。 此法高效(牺牲空间换时间),采用复制算法减少碎片。
- 使用 From 和 To 两个等大空间。对象先在 From 空间分配,当回收触发时:
- 老生代回收(结合 Mark-Sweep 和 Mark-Compact):
- 算法先标记对象(从根对象遍历可达对象)。
- Mark-Sweep: 清除未标记内存,但可能致内存碎片。
- Mark-Compact: 清理碎片并将活对象移至堆一端。
- 策略:优先用 Mark-Sweep,当内存不足时切换到 Mark-Compact。 适用于大规模对象回收。
- 算法先标记对象(从根对象遍历可达对象)。
优化点:
- 增量标记: 分散标记步骤以避免卡顿。
- 并行垃圾回收: 新生代中 multi-threading 提升速度。
这一机制确保内存高效利用,降低泄漏风险。