并发标记采用三色标记法作为逻辑骨架,通过写屏障防止并发修改导致的漏标风险。标记过程与用户线程并行,结束后需再标记阶段进行短暂STW,扫描写屏障记录的变化和GCRoots,确保标记完整性。
并发标记阶段——这是CMS、G1这些现代垃圾回收器实现“低停顿”承诺的核心武器。它的任务听起来不太复杂:在用户线程持续跑着的同时,把堆里哪些对象还活着准确找出来。但麻烦就在于,它不追求绝对的原子性,而是靠一套逻辑框架——三色标记法,再加一道写屏障(Write Barrier)来防住并发修改导致的漏标风险。说实话,把这个过程捋清楚了,才算真正懂了CMS和G1的设计精妙之处。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
整个堆在逻辑上被划分成三类对象:白、灰、黑。这并非某个JVM内部的具体数据结构,而是一种抽象的染色模型——它帮着GC线程判断当前标记到哪里了、下一步该扫谁。
以CMS或G1为例,并发标记通常在初始标记(一个短暂的STW停顿)之后立即启动。具体怎么跑的呢?
用户线程在并发标记期间,有两类操作可能破坏三色不变式,导致漏标:
为了拦住这些变动,JVM在写操作(比如putfield)的前后插入了写屏障。写屏障会把被修改的引用或相关对象记到“卡表(Card Table)”或者“增量更新/原始快照(SATB)缓冲区”里,等再标记阶段集中扫描。
再标记(Remark)是一个短暂的Stop-the-World阶段。它的活儿其实就两件:
由于绝大多数对象已经在并发标记阶段处理完毕,再标记只需要聚焦增量变化,所以STW暂停时间远短于初始标记。控制整体停顿的关键,恰恰就在这个环节的优化上。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述