探究JVM(六)判断对象是否存活?可达性分析算法

引言:JVM在进行GC的时候,要确定哪些对象是存活的,或者说哪些对象正在被使用,这些正在使用的对象是不能进行回收的。那么如何确定这个对象是否存活呢?

一 可达性分析算法

在可达性分析算法中可以先确定一些在当前时刻绝对不能被回收的对象,例如静态类型变量或者是当前栈帧中的局部变量表中引用的对象等等,这些不能被回收的对象构成了GC Root Set,从这些对象出发,寻找跟这些对象有直接或者间接关系的对象,然后把能够找到的对象标记为存活,那么剩下的区域里的对象都可以被清理。

*一个圆圈代表一个对象
如上图所示,对象A与对象B都和GC Root Set里面的对象有直接或者间接引用关系,所以A和B在这次GC中都存活,而对象C则被JVM回收。

二 扫描对象图的基本模型-三色标记

上文我们提到了用可达性分析算法来判断一个对象是否存活,它的具体是做法是从GC Root出发,扫描所有可以到达的对象和它的字段,在扫描的过程中,使用三种颜色来标记对象,三种不同的颜色代表了对象在扫描过程中不同的状态。
白色对象:尚未扫描的对象,如果整个GC结束后,对象依旧是白色,那么说明这个对象可以被回收。
灰色对象:灰色是自己已扫描但尚有字段未扫描的对象,是正在被GC线程访问的对象。
黑色对象:黑色是自己已扫描且字段也全部扫描了的对象,正常情况下GC线程不能再访问黑色对象。
当标记阶段(如果是CMS或者G1垃圾收集器则包括初始标记,并发标记,最终标记)结束的时候,对象图只有黑色和白色对象,这时候的白色对象被全部回收。

*一个圆圈代表一个对象
如上图所示,对象A在标记阶段结束后,会被判定为可以回收对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值