你了解 Node.js 的垃圾回收机制吗?

Node.js 中 V8 引擎使用分代回收模型进行垃圾回收。该机制将内存划分为新生代和老生代,采用 Scavenge 和 Mark-Sweep 算法。

Node.js 困难 垃圾回收 内存管理 V8

V8 引擎的垃圾回收机制自动管理内存释放与回收,核心基于分代回收模型。它将堆内存划分为新生代和老生代两个区域,具体流程如下:

  • 分代与假说:
    • 新生代 (New Space) 存储短期存活的新建对象,如新创建的变量。
    • 老生代 (Old Space) 存储长期存活的对象。
    • 理论基础是大多数对象快速消失。
  • 新生代回收(Scavenge 算法):
    • 使用 From 和 To 两个等大空间。对象先在 From 空间分配,当回收触发时:
      • 检测活对象(可达自根对象)。
      • 复制活对象到 To 空间,非活动对象释放。
      • 空间角色互换(From / To 互调)。
    • 晋升条件:
      • 对象经多次 Scavenge 回收后仍存活(自动晋升)。
      • To 空间使用量超 25%。 此法高效(牺牲空间换时间),采用复制算法减少碎片。
  • 老生代回收(结合 Mark-Sweep 和 Mark-Compact):
    • 算法先标记对象(从根对象遍历可达对象)。
      • Mark-Sweep: 清除未标记内存,但可能致内存碎片。
      • Mark-Compact: 清理碎片并将活对象移至堆一端。
    • 策略:优先用 Mark-Sweep,当内存不足时切换到 Mark-Compact。 适用于大规模对象回收。

优化点:

  • 增量标记: 分散标记步骤以避免卡顿。
  • 并行垃圾回收: 新生代中 multi-threading 提升速度。

这一机制确保内存高效利用,降低泄漏风险。