三色标记、原始快照与增量更新

一、三色标记(Tri-colorMarking)

1.1、定义

三色标记(Tri-colorMarking)把遍历对象图过程中遇到的对象,按照“是否访问过”这个条件标记成以下三种颜色:

  • 白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始的阶段,所有的对象都是白 色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达。

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

  • 灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有扫描过

二、原始快照 (Incremental Update)与增量更新( Snapshot AtThe Beginning,SATB)

2.1、需要解决的问题

如果用户线程与收集器是并发工作, 收集器在对象图上标记颜色,同时用户线程在修改引用关系一即修改对象图的结构,这样可能出现两种后果。

  1. 一种是把原本消亡的对象错误标记为存活,这不是好事,但其实是可以容忍的,只不过产生了一点逃过本次收集的浮动垃圾而已,下次收集清理掉就好。

  1. 另一种是把原本存活的对象错误标记为已消亡,这就是非常致命的后果了,程序肯定会因此发生错误。

Wilson 于 1994 年在理论上证明了,当且仅当以下两个条件同时满足时,会产生“对象消失”的问题,即原本应该是黑色的对象被误标为白色:

  • 赋值器插人了一条或多条从黑色对象到白色对象的新引用

  • 赋值器删除了全部从灰色对象到该白色对象的直接或间接引用

2.2、如何解决

因此,我们要解决并发扫描时的对象消失问题,只需破坏这两个条件的任意一个即可由此分别产生了两种解决方案:

  • 增量更新:要破坏的是第一个条件,当黑色对象插入新的指向白色对象的引用关系时就将这个新插 人的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为 根,重新扫描一次。这可以简化理解为,黑色对象一旦新插入了指向白色对象的引用之 后,它就变回灰色对象了

  • 原始快照:要破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删 除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为 根,重新扫描一次。这也可以简化理解为,无论引用关系删除与否,都会按照刚刚开始 扫描那一刻的对象图快照来进行搜索

以上无论是对引用关系记录的插入还是删除,虚拟机的记录操作都是通过写屏障实现的。在 HotSpot 虚拟机中,增量更新和原始快照这两种解决方案都有实际应用,譬如,CMS 是基于增量更新来做并发标记的,G1、Shenandoah 则是用原始快照来实现。

借道友法力一用:

========================== stay hungry stay foolish =============================

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值