JVM垃圾回收器之深入理解CMS垃圾回收器

CMS是JVM的一款并发低停顿垃圾回收器,主要特点是与用户线程并发执行。它使用三色标记法,通过Card Table优化跨代引用扫描。在垃圾回收过程中包括初始标记、并发标记、重新标记和并发清理等步骤,采用增量更新解决并发时的引用变化问题。然而,CMS存在CPU资源消耗高、浮动垃圾、内存碎片等缺点,可能导致额外的Full GC。了解CMS原理对于理解现代垃圾回收器如G1、ZGC至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

CMS垃圾回收器是本人理解最深刻的JVM垃圾回收器,CMS是首个可以与用户线程并发的低停顿收集器。随着技术的发展、JDK的更新迭代,CMS这个曾经被寄予厚望的并发垃圾回收器已经慢慢要被时代抛弃了,后面出来的G1,ZGC已经盖过了CMS的光芒,JDK9之后CMS甚至被抛弃为不建议使用。但是后来者都是踩在CMS肩膀上迭代的,你可以在G1中看到大量CMS代码的影子,同时现在国内很多公司依旧还在使用JDK8,无他就因为JDK8是最后开源的商用版本(不过JDK17又能用了。。。。),所以了解CMS垃圾回收器的原理还是很有必要的。

Card Table

card table在CMS中是为了辅助提高跨代引用的对象标记的,实质上是用空间换时间。因为分代的原因,存在跨代引用的问题,如果没有card table,young gc需要扫描整个堆。

卡表在JVM中通常以字节数组表示,每个数组的index对应年老代的某块固定区域,每个card大小为2的N次幂,hotspot为512字节。card 初始值都是0,当出现年老代到年轻代对象引用变化时,年老代对象所在的card位会设为1,表示当前区域为脏。当发生young gc后就只需要通过根进入年轻代进行根引用链扫描和通过根进入年老代扫描脏表区域就行了,避免了整堆扫描。

垃圾回收过程

CMS垃圾回收可以分为四个大的步骤,如果再细分可以分为七个细步骤:

  1. 初始标记:初始标记只标记gc root可以直接引用的对象和年轻代引用了年老代的对象。速度很快,需要暂停用户线程。

  2. 并发标记:并发标记使用多个gc线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值