三色法GC总结

作用:因并发标记过程中,程序还在跑。对象间的引用会发生变化,可能会导致漏标或错标情况。因此采用三色法,将扫描的各情况用颜色区别出来。

三种颜色

白色:一开始所有对象的颜色都是白色,即未扫描过的对象。

灰色:表示对象已经扫描到了,但是对象所在的引用对象,还未全部扫描完成。

黑色:表示当前对象自身以及引用对象都已扫描,标记为黑色。

备注:黑色对象不能直接指向白色对象,不经过黑色对象。

 

代码示例:

class A {
B b = new B();
D d = null;
}

class B {
C c = new C();
D d = new D();
}

class C {

}

class D {

}
以下为三色关系图

浮动垃圾:并发清除阶段,因程序没有暂停运行(考虑停顿时间),标记与用户线程交错的执行。导致产生了多余垃圾,需要下一次扫描才可通过垃圾回收清除。

 

漏标:会导致对象被当成垃圾误回收。所以此情况不允许发生

解决方案:

增量更新:当黑色对象突然引用白色对象时,黑色对象所指向白色对象需要变更为灰色对象。(待并发扫描结束后,在从黑色对象为根在扫描一次即可)

原始快照:灰色对象要删除白色对象的引用时,将要删除的引用记录下来,并发扫描结束后。再从引用关系为灰色对象扫描一下即可。

 

posted @   辉辉、  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示