JVM垃圾回收器之CMS三色标记、增量更新与跨代引用

JVM垃圾回收器之CMS三色标记、增量更新与卡表

Hello大家好,这里是残月。在上一篇关于JVM的文章中,我有讲到CMS的执行过程和优缺点,那么今天我们来深入了解一下其中一些底层细节方面的东西。

1.三色标记

什么是三色标记?实际上三色标记中的色并不只是颜色,而是我们对它的一种叫法,但是实际上他不会用red white 这种东西来定义,而是用例如0,1,2这样的东西来定义不同的对象。
其实三色标记就是我们CMS在扫描过程中对对象的一种定义。那么具体的定义如下:
黑色:表示对象已经被垃圾回收机制访问过或者对象引用的对象都被扫描到了,这个对象就会变成黑色。
灰色:可能至少存在一个引用还没有被扫描到。
白色:还没有被扫描到就是白色或者没有被GC ROOT引用的对象也会被定义为白色。
三色标记

如图上所示,假如说A引入了B,B引用了C,D没有被任何引用。那么首先我们的CMS首先扫描到了A,发现A有引用B,那么我们的CMS会将A标记为黑色,B标记为灰色,然后这时候,通过B又找到了C那么这个时候发现C已经没有任何引用了就会将C标记为黑色。*但是我们的D到目前为止没有被任何引用,记住我这里说的条件!!!*那么D从始至终都没有被 扫描,此时就会一直是白色,对于白色的对象来说CMS在执行并发清理的时候就会将此类对象干掉。但是这里有了一个问题:
如果我们的扫描过程已经结束这一段了,但是此时此刻我的A突然引用了D类型怎么办,这样一来我们的D只要被GC干掉是不是就会出现问题?也就是说我这里产生了一个漏标的问题。
当然,我们的JVM开发人员可不是傻子,这里他们用了一个操作叫做增量更新和写屏障来解决这种问题的。

2.增量更新与写屏障

所谓增量更新就是在并发标记过程中,把赋值的这种新增的引用,做一个集合存起来。在重新标记的时候会找到集合里面的引用然后重新去扫描,再把源头标记为灰色。这就是我们的增量更新。当然,在把我们新增的引用放到集合的时候,会实现一种写屏障的方式。写屏障我们可以理解为在赋值操作的前面加一个方法,赋值的后面做一些操作,也可以理解为AOP。具体的C++实现代码如下图:

在hotspot里,他使用了内联方法oop_store来实现的读写屏障,并且这里面有一个写前屏障和写后屏障的操作

我们定位到源代码出,我们可以看到他是在这里又调用了write_ref_field和write_ref_field_pre方法来进行一个写屏障的操作。这里我就不再跟进了,因为再往后跟进实际上是他对卡表的一些操作。

3.记忆集与卡表

在刚刚我们再说写屏障的时候提到了卡表,那么我们现在就来说说卡表是干什么用的。但是在说记忆集与卡表之前,我们要先知道what is 跨带引用~

  • 跨代引用:
    所谓跨代引用就是老年代的对象引用了新生代的对象,或者新生代的对象引用了老年代的对象。那对于这种情况我们的GC在进行扫描的时候不可能直接把我们的整个堆都扫描完,那这样效率也太低了。所以这时候就需要开辟了一小块空间,维护这种引用,而不必让GC扫描整个堆区域。
  • 记忆集:
    记忆集也叫rememberSet,垃圾收集器在新生代中建立了记忆集这样的数据结构,用来避免把整个老年代加入到GC ROOTS的扫描范围中。对于记忆集来说,我们可以理解为他是一个抽象类,那么具体实现它的方法将由子类去完成。这里我们简单列举一下实现记忆集的三种方式:
    1.字长精度
    2.对象精度
    3.卡精度(卡表)
  • 卡表:
    卡表(Card Table)是一种对记忆集的具体实现。主要定义了记忆集的记录精度、与堆内存的映射关系等。卡表中的每一个元素都对应着一块特定大小的内存块,这个内存块我们称之为卡页(card page),当存在跨带引用的时候,它会将卡页标记为dirty。那么JVM对于卡页的维护也是通过写屏障的方式,这也就是为什么刚刚我们跟进写屏障操作到最后会发现它会对卡表进行一系列的操作。
    维护卡表的写屏障操作

好啦,今天的文章就到这里。喜欢的话记得点赞收藏关注三连哦~

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值