一文讲解CMS收集器的垃圾收集过程

CMS就是Concurrent Mark Sweep
在这里插入图片描述
CMS使用标记-清除算法进行垃圾收集,分为4大步:

  1. 初始标记:标记所有从GC Roots直接可达的对象,这个阶段需要STW,但速度很快
  2. 并发标记:从初始标记的对象出发,遍历所有对象,标记所有可达的对象,这个阶段是并发进行的;
  3. 重新标记:完成剩余的标记工作,包括处理并发阶段遗留下来的少量变动,这个阶段通常需要短暂的STW停顿;
  4. 并发清除:清除未被标记的对象,回收他们占用的内存空间;

那么,再刚刚的过程中,你提到了重新标记,重新标记是怎么执行的?

  • 重新标记remark阶段通常会结合三色标记法来执行,确保在并发标记期间所有存活对象都被正确标记。目的是修正并发标记阶段中可能遗漏的对象引用变化;
  • 在remark阶段,垃圾收集器会停止应用线程STW,以确保在这个阶段不会有引用关系的进一步变化。这种暂停通常很短暂。remark阶段主要包括了以下操作:
    • 处理写屏障记录的引用变化:在并发标记阶段,应用程序可能会更新对象的引用(比如以一个黑色对象新增了对一个白色对象的引用),这些变化通过写屏障记录下来。在remark阶段,GC会处理这些记录,确保所有可达对象都正确地标记为灰色或黑色。
    • 扫描灰色对象:再次遍历灰色对象,处理它们的所有引用,确保引用的对象正确标记为灰色或者黑色。
    • 清理:确保所有引用关系正确处理后,灰色对象标记为黑色,白色对象保持不变。这一步完成后,所有存活对象都应当是黑色的;

刚刚提到了三色标记法,那就顺带普及下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值