并发收集,三色标记算法

前言:之前我们讲过CMS收集器的回收过程,有一步骤是并发标记,他会在不停止应用线程的情况下判断是否为垃圾对象。感觉就像是你在家里打扫卫生时,你儿子又在一旁丢垃圾一样。这些新出现的垃圾如何处理?再有你认为是垃圾的东西,你儿子却又拿过去玩怎么办?相反你认为有用的东西,实际上又变成垃圾了咋整?

一,三色标记概念
这里三色可以理解为gc过程中对象的扫描状态。采用可达性分析算法,从Gc Roots逐级往下查找。
黑色:表示当前对象已经被垃圾收集器访问过,并且对象里面的所有引用都扫描过。表示对象是存活的
灰色:表示当前对象已经访问过,但对象里面的引用还没有扫描或只扫描了部份。
白色:表示当前对象暂未被扫描过。默认所有对象为白色的,如果扫描分析结束对象仍然是白色,则证明不可达,从而可能被当成垃圾回收掉。

二,多标和漏标的问题
1,多标
即你认为有用的东西,实际上变成没用的。想象下在并发标记过程中,gc可能先扫描到了对象并把对象标记为非垃圾对象,但后来应用线程把对象的引用都删除掉了,此时对象应该变成白色成为垃圾对象,但是gc不知道。这种情况就是多标,多标会产生浮动垃圾,而本次gc并不会回收这部份垃圾,而会留到下次gc过来回收。

2,新增对象
即在标记过程中,又有新对象挪到了老年代中,这种情况下产生的对象都会标记为黑色,本次gc不回收(就算变成了垃圾对象也不会回收)。

3,漏标
最坑的应该是这种了:你认为是垃圾的东西,你儿子却又拿过去玩怎么办。在标记过程中,出现了已经为黑色的对象引用了一个白色的对象。因为黑色对象gc不会再扫描了,而白色对象gc又扫描不到,但实际白色对象是存在引用的。这种情况下白色对象是不能够被回收的,否则就会出现严重bug。
在这里插入图片描述

垃圾收集器会有一个类似于“操作日志”的东西,当我们添加引用或者删除引用的时候,会把这添加和删除的引用记录下来。等并发扫描完成后,重新扫描一次(重新标记)。而这种操作日志有个专有名词叫作写屏障(有点类似切面的概念)

增量更新:当应用程序执行中添加对象引用后,会记录这个新增的引用(CMS用的这种处理漏标问题)
在这里插入图片描述
原始快照(SATB):当应用程序删除对象引用前,会记录这个删除的引用(自行脑补)

总结:关于垃圾收集器内容到此就告一段落了。我分了四个章节讲,足以看出他的复杂程度。接下来就是要看一些面试题巩固一下啦,期待下期吧。我是阿雷,一名深漂程序员~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值