三色法GC总结
作用:因并发标记过程中,程序还在跑。对象间的引用会发生变化,可能会导致漏标或错标情况。因此采用三色法,将扫描的各情况用颜色区别出来。
三种颜色
白色:一开始所有对象的颜色都是白色,即未扫描过的对象。
灰色:表示对象已经扫描到了,但是对象所在的引用对象,还未全部扫描完成。
黑色:表示当前对象自身以及引用对象都已扫描,标记为黑色。
备注:黑色对象不能直接指向白色对象,不经过黑色对象。
代码示例:
class A {
B b = new B();
D d = null;
}
class B {
C c = new C();
D d = new D();
}
class C {
}
class D {
}
以下为三色关系图
浮动垃圾:并发清除阶段,因程序没有暂停运行(考虑停顿时间),标记与用户线程交错的执行。导致产生了多余垃圾,需要下一次扫描才可通过垃圾回收清除。
漏标:会导致对象被当成垃圾误回收。所以此情况不允许发生
解决方案:
增量更新:当黑色对象突然引用白色对象时,黑色对象所指向白色对象需要变更为灰色对象。(待并发扫描结束后,在从黑色对象为根在扫描一次即可)
原始快照:灰色对象要删除白色对象的引用时,将要删除的引用记录下来,并发扫描结束后。再从引用关系为灰色对象扫描一下即可。
每天坚持,终会抵达!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了