垃圾回收之CMS GC

 一.六个阶段

阶段 1: Initial Mark(初始标记)

这个阶段伴随着 STW 暂停。初始标记的目标是标记所有的 根对象,包括根对象直接引用的对象,以及被年轻代中所 有存活对象所引用的对象(老年代单独回收)。

阶段 2: Concurrent Mark(并发标记)

在此阶段,CMS GC 遍历老年代,标记所有的存活对象,从 前一阶段 “Initial Mark” 找到的根对象开始算起。 “并发标 记”阶段,就是与应用程序同时运行,不用暂停的阶段。

阶段 3: Concurrent Preclean(并发预清理)

此阶段同样是与应用线程并发执行的,不需要停止应用线 程。 因为前一阶段【并发标记】与程序并发运行,可能 有一些引用关系已经发生了改变。如果在并发标记过程中 引用关系发生了变化,JVM 会通过“Card(卡片)”的方 式将发生了改变的区域标记为“脏”区,这就是所谓的 卡片 标记(Card Marking)。 

阶段 4: Final Remark(最终标记)

最终标记阶段是此次 GC 事件中的第二次(也是最后一次)STW 停顿。本阶段的目标是完成老年代中所有存活对象的标记。因为 之前的预清理阶段是并发执行的,有可能 GC 线程跟不上应用程 序的修改速度。所以需要一次 STW 暂停来处理各种复杂的情况。 通常 CMS 会尝试在年轻代尽可能空的情况下执行 Final Remark 阶段,以免连续触发多次 STW 事件。

阶段 5: Concurrent Sweep(并发清除)

此阶段与应用程序并发执行,不需要 STW 停顿。JVM 在此 阶段删除不再使用的对象,并回收他们占用的内存空间。

阶段 6: Concurrent Reset(并发重置)

此阶段与应用程序并发执行,重置 CMS 算法相关的内部 数据,为下一次 GC 循环做准备

二.CMS优缺点

CMS 垃圾收集器在减少停顿时间上做了很多复杂而有用的 工作,用于垃圾回收的并发线程执行的同时,并不需要暂停 应用线程。 当然,CMS 也有一些缺点,其中最大的问题就 是老年代内存碎片问题(因为不压缩),在某些情况下 GC 会造成不可预测的暂停时间,特别是堆内存较大的情况下。

三.特点

其对年轻代采用并行 STW 方式的 mark-copy (标记-复制)算法,对老年代主要使用并发 mark-sweep ( 标记-清除)算法。

CMS GC 的设计目标是避免在老年代垃圾收集时出现长时间的卡顿,主要通过两种手段来达成此目标:

1)不对老年代进行整理,而是使用空闲列表(free-lists)来管理内存空间的回收。

2) 在 mark-and-sweep (标记-清除) 阶段的大部分工作和应用线程一起并发执行。

也就是说,在这些阶段并没有明显的应用线程暂停。但值得注意的是,它仍然和应用线程争抢CPU 时。 默认情况下,CMS 使用的并发线程数等于 CPU 核心数的 1/4。 如果服务器是多核 CPU,并且主要调优目标是降低 GC 停顿导致的系统延迟,那么使用 CMS 是个很明智 的选择。进行老年代的并发回收时,可能会伴随着多次年轻代的 minor GC

四.参数配置

java -Xmx1g -Xms1g -XX:-UseAdaptiveSizePolicy -XX:-UseConcMarkSweepGC -jar gateway-server-0.0.1-SNAPSHOT.jar
五.并行 Parallel 与并发 Concurrent 的区别?

两者都是多线程运行,不同的是,并行Parallel在GC期间所有的CPU内核都用来做垃圾回收,暂停了业务线程;而并发 Concurrent在GC期间大部分时候和应用线程一起执行,不影响业务线程的连续执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值