java垃圾回收-三色标记法

引言

在CMS,G1这种并发的垃圾收集器收集对象时,假如一个对象A被GC线程标记为不可达对象,但是用户线程又把A对象做清楚时 将会发生严重的错误,那么jvm是如何处理这种问题呢?

什么是三色标记法

主流的垃圾收集器基本上都是基于可达性分析算法来判断对象是否存活的,根据对象是否被垃圾收集器扫描过而用黑白灰三种颜色来标记对象状态的方法。

白色

表示对象尚未被垃圾收集器扫描过。在可达性分析开始阶段,所有的对象都是白色的。若在分析结束后对象仍是白色,则代表对象为不可达对象,需要对这些对象进行回收。

灰色

表示对象已经被垃圾回收器访问过,但这个对象至少存在一个引用还没被扫描过。

黑色

表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。 黑色的对象代表已经被扫描过,他是安全存活的,如果有其他对象引用指向了黑色对象,无需重新扫描一遍。黑色对象不可能直接指向某个白色对象。

三色标记过程

  1. 在gc线程开始标记的时候,所有的对象都是白色,全部放入白色节点集合中。
    在这里插入图片描述

  2. 然后从gc root set开始进行扫描,首先node1,node5 被扫描到,node 1、5被标记成灰色节点,从白色节点集合中挪到灰色节点集合中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值