jvm垃圾回收的三色标记法

在上面文章中已经提到CMS的垃圾收集构成分为初始标记、并发标记、重新标记、并发清理等过程,其中初始标记和重新标记会STW(stop the world)暂停其他线程,在并发标记和并发清理时会与应用线程同时进行。CMS是采用三色标记法来进行垃圾的收集:三色标记即是用三种三色来标记对象的引用情况:
黑色标记:表示此对象及其所有的引用都已经被扫描过,表明这个对象是存活的,肯定不会被垃圾回收;
灰色标记:表示此对象被垃圾回收器扫描过,但是这个对象上的引用还没有被完全扫描即存在没有被扫描的对象引用(至少一个),灰色标记的对象也是不被回收的;
白色标记:表示此对象及其引用还未被垃圾回收器扫描过,若在分析标记结束后即在重新标记结束后,还是白色标记表示此对象可以被回收。
在这里插入图片描述通过此图及CMS收集过程会发现在并发标记和并发清理阶段都会产生垃圾对象,在并发标记阶段应用线程还可能产生新的对象引用,这样如果新产生的对象不能被标记成存活对象,那么将新产生的引用对象清理这会造成程序的严重问题。
解决此问题主要有两种方案:增量更新和原始快照
增量更新:在并发标记的过程中,若针对黑色标记的对象会产生新的对象引用,会先将这些记录下来,在重新标记的过程中,会将黑色标记的对象为起点,重新扫描一次,扫描到新的引用了,然后将扫描到的对象进行标记灰色,这样在垃圾清理的过程中就不会清理掉新产生的引用。
在这里插入图片描述原始快照:就是在并发标记过程中,在灰色标记准备删除白色标记的引用时,会先记录下来,在并发扫描结束,重新标记的过程中,会将记录过的灰色对象为起点,进行扫描,扫描到的白色引用对象置为黑色标记,这样就不会清理掉这些对象。

在这里插入图片描述上面是针对漏标对象的解决方案,针对在并发标记和并发清理的过程中应用线程会产生垃圾对象但是这部分对象在标记过程为灰色或黑色非垃圾对象,称为浮动垃圾,针对浮动垃圾在本次gc过程中不会做处理,会在下一次gc时进行回收。在以上对引用关系的插入和删除是通过写屏障来实现的,写屏障的大致原理为:
在对引用关系进行写操作时,理解为在写方法前面加入写前操作来记录操作信息,在写后操作来记录写后的信息,类似于AOP

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值