三色标记: 通过mspan查看是否被引用 灰色:对象已被标记,但这个对象包含的子对象未标记 黑色:对象已被标记,且这个对象包含的子对象也已标记,gcmarkBits对应的位为1(该对象不会在本次GC中被清理) 白色:对象未被标记,gcmarkBits对应的位为0(该对象将会在本次GC中被清理) 例如,当前内存中有A~F一共6个对象,根对象a,b本身为栈上分配的局部变量,根对象a、b分别引用了对象A、B, 而B对象又引用了对象D,则GC开始前各对象的状态如下图所示: 初始状态下所有对象都是白色的。 接着开始扫描根对象a、b; 由于根对象引用了对象A、B,那么A、B变为灰色对象,接下来就开始分析灰色对象,分析A时,A没有引用其他对象很快就转入黑色,B引用了D,则B转入黑色的同时还需要将D转为灰色,进行接下来的分析。 灰色对象只有D,由于D没有引用其他对象,所以D转入黑色。标记过程结束 最终,黑色的对象会被保留下来,白色对象会被回收掉。

相关推荐

昨天 14:14
已编辑
上海大学 Java
点赞 评论 收藏
分享
牛客网
牛客企业服务