面试题答案
一键面试三色标记法原理
- 三色定义:
- 白色:表示对象尚未被垃圾回收器访问过。在标记开始阶段,所有对象均为白色。
- 灰色:表示对象已经被垃圾回收器访问过,但其所有子对象还未被全部访问完。
- 黑色:表示对象及其所有子对象都已经被垃圾回收器访问过。
- 标记过程:
- 从根对象(如栈上的引用、静态变量等)开始,将其标记为灰色,放入灰色对象集合。
- 从灰色对象集合中取出一个灰色对象,遍历其所有的直接引用对象,将这些直接引用对象标记为灰色,并放入灰色对象集合,然后将该灰色对象标记为黑色。
- 重复上述过程,直到灰色对象集合为空,此时白色对象即为垃圾对象,可以被回收。
可能出现的漏标问题
- 条件:
- 当一个黑色对象的子对象(原本可达)在标记过程中被赋值为null,同时另一个白色对象被赋值给了这个黑色对象原来子对象的位置,且这个白色对象在赋值前没有被其他灰色对象引用,就会出现漏标问题。
- 简单来说,就是在标记过程中,对象引用关系发生变化,导致原本可达的对象被错误地标记为不可达(白色)。
解决漏标问题
- 增量更新:
- 实现机制:当黑色对象引用白色对象的关系被破坏(如黑色对象的某个子对象引用被置为null,同时新引用指向白色对象)时,记录这个引用关系变化。在标记结束后,将这些记录的引用关系中的白色对象重新标记为灰色,放入灰色对象集合,重新进行标记。
- 相关技术点:需要一个数据结构(如写屏障)来记录引用关系的变化。写屏障在每次对象引用关系发生变化时,都会进行相应的记录操作,保证所有可能导致漏标的引用关系变化都能被捕获。
- 原始快照(SATB):
- 实现机制:在标记开始时,记录下所有对象之间的引用关系快照。在标记过程中,如果对象的引用关系发生变化,判断变化是否导致了白色对象从可达变为不可达。如果是,则将该白色对象重新标记为灰色,放入灰色对象集合重新标记。
- 相关技术点:同样依赖写屏障来捕获引用关系变化。在引用关系发生变化时,根据快照判断是否需要将白色对象重新标记为灰色。同时,需要高效的快照记录和比对机制,以保证在标记过程中能快速处理引用关系变化。