CMS垃圾回收机制

什么是CMS

Concurrent Mark Sweep。看名字就知道,CMS是一款并发、使用标记-清除算法的GC。CMS是针对老年代进行回收的GC。

CMS有什么用

CMS以获取最小停顿时间为目的,在一些对响应时间有很高要求的应用或网站中,用户对时间很敏感,CMS很适合这种场景。

CMS如何执行

总的来说CMS执行过程可以分成下面几个阶段:

  1. 初始标记
    该阶段进行可达性分析,标记GC ROOT能直接关联的对象。
  2. 并发标记
    并发标记阶段是GC线程和用户线程并发执行的过程,该阶段进行GC ROOT TRACING,在第一阶段暂停的线程重新开始运行。由前阶段标记过的对象出发,所有可到达的对象都在这个阶段被标记。
  3. 并发预清理
    并发预处理阶段做的工作还是标记,与重标记功能相似。

既然相似为什么要有这一步?
前面我们讲过,CMS是以获取最短停顿时间为目的的GC。
重标记需要STW(Stop The World),因此重标记的工作尽可能多的在并发阶段完成来减少STW的时间。
此阶段标记从新生代晋升的对象、新分配到老年代的对象以及在并发阶段被修改了的对象。
此阶段比较复杂,从初学者容易忽略或者说不理解的地方抛出一个问题大家思考下:
如何确定老年代的对象是活着的?
答案很简单,通过GC ROOT TRACING可到达的对象就是活着的。
继续延伸,如果存在以下场景怎么办:

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。
572213_20160411232307395_1644993623
老年代进行GC时如何确保上图中Current Obj标记为活着的?
答案是必须扫描新生代来确保。这也是为什么CMS虽然是老年代的GC,但仍要扫描新生代的原因。(注意初始标记也会扫描新生代)
在CMS日志中我们可以清楚地看到扫描日志:

[GC[YG occupancy: 820 K (6528 K)]
[Rescan (parallel) , 0.0024157 secs]
[weak refs processing, 0.0000143 secs]
[scrub string table, 0.0000258 secs] 
[1 CMS-remark: 479379K(515960K)] 480200K(522488K), 0.0025249 secs] 
[Times: user=0.01 sys=0.00, real=0.00 secs]

Rescan阶段(remark阶段的一个子阶段)会扫描新生代和老年代中的对象。在日志中可以看到此阶段标识为Rescan (parallel),说明此阶段是并行进行的。

原文链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值