MST

星途 面试题库

面试题:Java CMS回收器的三色标记法及漏标问题解决

在Java并发标记清理回收中,三色标记法是重要的标记策略。请深入分析三色标记法的原理,以及可能出现的漏标问题,并且说明如何解决漏标问题,包括具体的实现机制和涉及的相关技术点。
16.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

三色标记法原理

  1. 三色定义
    • 白色:表示对象尚未被垃圾回收器访问过。在标记开始阶段,所有对象均为白色。
    • 灰色:表示对象已经被垃圾回收器访问过,但其所有子对象还未被全部访问完。
    • 黑色:表示对象及其所有子对象都已经被垃圾回收器访问过。
  2. 标记过程
    • 从根对象(如栈上的引用、静态变量等)开始,将其标记为灰色,放入灰色对象集合。
    • 从灰色对象集合中取出一个灰色对象,遍历其所有的直接引用对象,将这些直接引用对象标记为灰色,并放入灰色对象集合,然后将该灰色对象标记为黑色。
    • 重复上述过程,直到灰色对象集合为空,此时白色对象即为垃圾对象,可以被回收。

可能出现的漏标问题

  1. 条件
    • 当一个黑色对象的子对象(原本可达)在标记过程中被赋值为null,同时另一个白色对象被赋值给了这个黑色对象原来子对象的位置,且这个白色对象在赋值前没有被其他灰色对象引用,就会出现漏标问题。
    • 简单来说,就是在标记过程中,对象引用关系发生变化,导致原本可达的对象被错误地标记为不可达(白色)。

解决漏标问题

  1. 增量更新
    • 实现机制:当黑色对象引用白色对象的关系被破坏(如黑色对象的某个子对象引用被置为null,同时新引用指向白色对象)时,记录这个引用关系变化。在标记结束后,将这些记录的引用关系中的白色对象重新标记为灰色,放入灰色对象集合,重新进行标记。
    • 相关技术点:需要一个数据结构(如写屏障)来记录引用关系的变化。写屏障在每次对象引用关系发生变化时,都会进行相应的记录操作,保证所有可能导致漏标的引用关系变化都能被捕获。
  2. 原始快照(SATB)
    • 实现机制:在标记开始时,记录下所有对象之间的引用关系快照。在标记过程中,如果对象的引用关系发生变化,判断变化是否导致了白色对象从可达变为不可达。如果是,则将该白色对象重新标记为灰色,放入灰色对象集合重新标记。
    • 相关技术点:同样依赖写屏障来捕获引用关系变化。在引用关系发生变化时,根据快照判断是否需要将白色对象重新标记为灰色。同时,需要高效的快照记录和比对机制,以保证在标记过程中能快速处理引用关系变化。