V8垃圾回收中,三色标记法在增量标记阶段的工作原理是怎样的?

2026-05-07 07:460阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计938个文字,预计阅读时间需要4分钟。

V8垃圾回收中,三色标记法在增量标记阶段的工作原理是怎样的?

V8 引擎中的三色标记法增强了增量标记阶段,本质上是对长时间停顿的‘全量可达到性分析’进行分解,形成多个微小、可中断、可恢复的扫描单元。通过颜色状态维护中间一致性,并借助写屏障技术进行捕获并发修改,从而实现近乎无感的内存回收。

三色状态不是真实染色,而是逻辑划分

白色、灰色、黑色不对应内存中的实际字节,而是 GC 线程维护的三个逻辑集合(或对象状态位):

  • 白色:尚未被 GC 访问过,默认状态;若标记结束仍为白色,且无法从 GC Roots 到达,则判定为垃圾
  • 灰色:已入队待处理,其自身被访问过,但所引用的对象还未全部检查;它是“工作队列”的入口点
  • 黑色:已完全扫描完毕,自身及其所有直接/间接引用对象都确认存活;黑色对象不再参与本轮标记推进

增量标记如何“分步穿插”执行

V8 不等应用暂停才启动标记,而是在 JavaScript 引擎空闲间隙(如事件循环空转、帧渲染间隔)主动插入一小段标记任务:

  • 每次只从灰色集合中取出几十个对象,遍历其引用,把新发现的白色对象涂灰、自身涂黑
  • 执行完当前小批次后立即交还控制权给 JS 主线程,下次空闲时从中断处继续
  • 整个灰色集合像一个“待办清单”,逐步清空;当它彻底为空,且无写屏障记录的脏引用,标记即完成

写屏障解决并发漏标问题

用户线程运行时可能修改引用关系,导致本该存活的对象被跳过(漏标)。

阅读全文

本文共计938个文字,预计阅读时间需要4分钟。

V8垃圾回收中,三色标记法在增量标记阶段的工作原理是怎样的?

V8 引擎中的三色标记法增强了增量标记阶段,本质上是对长时间停顿的‘全量可达到性分析’进行分解,形成多个微小、可中断、可恢复的扫描单元。通过颜色状态维护中间一致性,并借助写屏障技术进行捕获并发修改,从而实现近乎无感的内存回收。

三色状态不是真实染色,而是逻辑划分

白色、灰色、黑色不对应内存中的实际字节,而是 GC 线程维护的三个逻辑集合(或对象状态位):

  • 白色:尚未被 GC 访问过,默认状态;若标记结束仍为白色,且无法从 GC Roots 到达,则判定为垃圾
  • 灰色:已入队待处理,其自身被访问过,但所引用的对象还未全部检查;它是“工作队列”的入口点
  • 黑色:已完全扫描完毕,自身及其所有直接/间接引用对象都确认存活;黑色对象不再参与本轮标记推进

增量标记如何“分步穿插”执行

V8 不等应用暂停才启动标记,而是在 JavaScript 引擎空闲间隙(如事件循环空转、帧渲染间隔)主动插入一小段标记任务:

  • 每次只从灰色集合中取出几十个对象,遍历其引用,把新发现的白色对象涂灰、自身涂黑
  • 执行完当前小批次后立即交还控制权给 JS 主线程,下次空闲时从中断处继续
  • 整个灰色集合像一个“待办清单”,逐步清空;当它彻底为空,且无写屏障记录的脏引用,标记即完成

写屏障解决并发漏标问题

用户线程运行时可能修改引用关系,导致本该存活的对象被跳过(漏标)。

阅读全文