CMS写屏障和增量更新

CMS垃圾收集过程


CMS收集齐的垃圾收集分为四步:

●初始标记(CMS initial mark):单线程运行,需要Stop The World,标记GC Roots能直达的对象。

●并发标记(CMS concurrent mark):无停顿,和用户线程同时运行,从GC Roots直达对象开始遍历整个对象图。

●重新标记(CMS remark):多线程运行,需要Stop The World,标记并发标记阶段产生对象。

●并发清除(CMS concurrent sweep):无停顿,和用户线程同时运行,清理掉标记阶段标记的死亡的对象。也是浮动垃圾产生主要原因。

Concurrent Mark Sweep收集器运行示意图如下:

CMS写屏障和增量更新

简单来说,由于CMS写屏障和增量更新的局限性,产生浮动垃圾,就算有重新标记阶段也不能完全清除并发标记的所有的对象,具体一点,需要新增黑色到白色的引用,JVM就会通过写屏障,将黑色变成灰色,灰色是子对象还没被访问过,而灰色节点还是没法删除,就产生了浮动垃圾

CMS(Concurrent Mark Sweep)收集器因写屏障和增量更新的局限产生浮动垃圾的详细解释,以及相关原理的深入剖析:

写屏障与增量更新概述
写屏障

写屏障(Write Barrier)是一种在垃圾回收机制中用于拦截对象引用关系修改操作的技术手段。当应用程序执行会改变对象引用关系的指令(比如对象的赋值操作,将一个对象的某个字段引用指向新的对象等)时,写屏障就会介入,在这个修改动作执行前后执行一些额外的代码逻辑,目的是为了辅助垃圾回收器更好地跟踪对象的存活状态变化,确保标记阶段的准确性。

增量更新

增量更新(Incremental Update)是 CMS 收集器在并发标记阶段采用的一种策略,用于处理对象引用关系变化的情况。在并发标记过程中,当发现一个原本未被标记为存活的对象,因为某个应用程序线程执行了写操作而使得其被一个已标记的存活对象引用时,并不会立即将这个原本未标记的对象标记为存活,而是将这个引用关系变化记录下来,等待重新标记阶段再根据这些记录来更新标记情况,确保该对象能被正确标记为存活。

产生浮动垃圾的原因
写屏障的局限性

  • 无法涵盖所有情况:虽然写屏障能够捕获一部分对象引用关系的变化,但它并不能捕捉到所有可能影响对象存活状态的场景。例如,在并发标记阶段,应用程序可能会通过一些复杂的间接引用或者基于反射机制等非传统的方式去创建新的对象引用关系,这些情况可能会绕过写屏障的检测,使得相应的对象无法及时被正确标记,进而成为潜在的浮动垃圾。

  • 性能与准确性的权衡:写屏障本身的实现需要一定的性能开销,为了不过分影响应用程序的运行效率,其检测逻辑不能过于复杂和全面。所以在设计上,会在保证一定性能的前提下进行优化,这就导致了可能会遗漏一些对象引用变化的情况,使得部分应该标记为存活的对象没有被标记到,最终产生浮动垃圾。

增量更新的局限

  • 记录与处理延迟:增量更新只是记录下了在并发标记阶段中对象引用关系的变化情况,等待重新标记阶段来统一处理。然而,在重新标记阶段之前,应用程序依然在持续运行并产生新的对象和更多的引用关系变化,这些后续产生的变化在重新标记阶段可能无法全部及时处理。例如,在重新标记阶段开始前的一小段时间内,又有大量新的引用关系建立了,但由于之前记录的变化还没处理完,新的变化来不及记录或者无法完全在重新标记阶段被准确处理,就会导致部分对象被误判为垃圾,成为浮动垃圾。

  • 无法精准追踪实时变化:增量更新机制是基于已有的记录来更新标记,它很难实时地、精准地追踪每一个瞬间的对象存活状态变化,尤其是在高并发的应用场景下,对象引用关系的变化非常频繁且复杂,增量更新很难做到完全跟上变化节奏,这就不可避免地会遗漏一些对象的正确标记,从而产生浮动垃圾。

对比与总结

与其他一些更先进的垃圾收集器(如 G1 等)相比,G1 采用了不同的标记和处理机制,能够在一定程度上更精细地应对这些问题。例如,G1 通过区域化的内存管理(划分多个 Region),可以基于更小的区域粒度来跟踪对象变化,同时配合更合理的并发与停顿阶段设计以及更具针对性的回收策略等,能够更及时、准确地标记存活对象,减少因为类似写屏障和增量更新局限所导致的浮动垃圾产生情况。

CMS 收集器中写屏障和增量更新在应对并发情况下对象引用关系变化时存在一定的局限性,才导致了浮动垃圾的产生,这也是 CMS 在垃圾回收准确性方面有待改进的一个方面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值