CMS三色标记算法
2021-09-09 15:20:57 0 举报
一文读懂CMS三色标记算法
作者其他创作
大纲/内容
D
自己已经标记,fields都标记完成
A
G1原始快照
对象树中的节点对象已经标记完成,该对象的成员变量fields没来及标记
自己已经标记,fields还没来得及标记
没有遍历到的节点
B
疑问:那么什么情况下会产生错标呢?
第二种情况:灰色-->白色消失,与此同时,黑色-->白色
引用
增量更新(Incremental Update):当黑色对象插入新的指向白色对象的引用关系时,就将这个要删除的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次,这可以理解为,黑色对象一旦插入了指向白色对象的引用之后,就变成灰色对象了
并发标记过程中,灰色指向白色的引用消失了,白色对象变为垃圾对象,然而此时黑色对象的引用又重新指向了白色对象,白色对象此时又变为了非垃圾对象,于是出现了白色对象错标的问题
增量更新算法
三色标记法
错标解决方案
font color=\"#0000ff\
白色
对象树中的节点对象已经标记完成,该对象的成员变量fields都标记完成
对象树中的节点对象没有标记,没有遍历到
灰色
黑色
并发标记过程中,本来想根据已经标记过的对象,重新标记对象树下的对象,结果访问不到了,白色对象简称浮动垃圾,待下次GC清理白色对象即可(白色对象之前非垃圾对象,后来变为垃圾对象)
i style=\
通过写屏障将黑色对象变为灰色,重新标记时,则会重新对白色对象进行标记
GC Roots根节点
搜索和标记过程
0 条评论
回复 删除
下一页