CMS垃圾收集器原理

CMS(Concurrent Mark Sweep)垃圾收集器采用标记-清理算法,通过四个阶段进行垃圾回收,尽量减少系统停顿。它在初始标记和重新标记阶段会暂停应用,其余阶段与应用程序并发执行。CMS通过并发预清理和并发清理阶段高效处理垃圾,以降低对系统性能的影响。

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

一般我们老年代的垃圾收集器都是使用的CMS(Concurrent Mark Sweep)。CMS使用的是标记-清理算法,工作流程大致是先标记需要回收的对象,然后回收垃圾,最后将存活的对象整理到一边,防止出现太多的内存碎片。有人说这不就是标记-整理算法吗,但是标记整理算法的步骤是先标记需要回收的对象,然后将存活的对象整理到一边,最后才将端边界之外的可回收对象清理。

因为在垃圾收集的时候,必然会产生“Stop the World”时间,让系统短暂不可用,所以CMS垃圾回收器采取的是垃圾回收线程和工作线程尽量同时执行的模式,减少系统的停顿。

CMS垃圾收集器分为4个阶段

  1. 初始标记

这个阶段需要STW(Stop the World),会停止所有的工作线程,然后标记所有GC Roots直接引用的对象,一般方法的局部变量和类的静态变量是GC Roots。这个阶段虽然会停止工作线程,但是标记GC Roots直接引用的对象速度非常块,所以影响很小。

  1. 并发标记

这个阶段工作线程和垃圾回收线程会一起工作,工作线程不停的创造新的对象,也有一些存活的对象失去引用,变成了垃圾对象,垃圾回收线程会将那些GC Roots可达的对象都标记出来。这个阶段是最耗时的阶段,因为是对老年代所有的对象进行GC Roots追踪,但是因为工作线程也在同时运行,所以不会让系统停顿。

2.5.并发预清理

这个阶段其实是为了给重新标记阶段减少工作量,此阶段标记从新生代晋升的对象、新分配到老年代的对象以及在并发阶段被修改了的对象。那如果老年代的对象引用到了新生代的GC Roots,如何来判断这个对象是否是存活的对象呢ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值