并行并发CMS垃圾回收器:-XX:+UseConcMarkSweepGC

概述

  • CMS为基于标记清除算法实现的多线程老年代垃圾回收器。CMS为响应时间优先的垃圾回收器,适合于应用服务器,如网络游戏,电商等和电信领域的应用。
  • 为了实现这个目的,与其他垃圾回收器不同的是,CMS是与应用程序并发执行的,即在CMS对老年代进行垃圾回收时,应用程序大部分时间里是可以继续执行的,应用程序只需进行非常短暂的停顿。由于与应用程序并发执行,同一时刻同时存在垃圾回收线程和应用线程,故对服务器的CPU消耗较大,需要保证服务器CPU资源充足。

执行过程

  1. 初始标记:应用程序需要停顿,主要是收集GC roots直接引用的对象并标记这些对象为存活对象,这些对象可能在新生代或者老年代,即需要对整个堆进行扫描,不过由于直接引用的对象较少,故不需要消耗很长的时间;
  2. 并发标记:与应用程序并发执行,从初始标记阶段所收集到的GC roots直接引用的对象出发,继续扫描查找和标记可达的对象,这个过程涉及到整个堆,即包括新生代和老年代,故需要耗费较长时间,所以与应用程序并发执行,不会对应用程序造成干扰;
  3. 并发预清理:并发预清理主要是将新生代中在并发标记阶段中晋升到老年代的对象进行清理,减少新生代中对象的数量,减少下一阶段重新标记需要扫描的对象数量。并发预清理阶段默认执行时间不能超过5s,否则直接进入重新标记阶段,默认值5s可以通过JVM参数:-XX:CMSMaxAbortablePrecleanTime 来调整。除此之外,还可以通过JVM参数:-XX:+CMSScavengeBeforeRemark 来开启在进行重新标记Remark之前,强制对新生代执行一次MinorGC,从而减少重新标记阶段需要扫描的对象数量,减少Remark的执行时间;
  4. 重新标记:应用程序需要停顿,由于并发标记阶段,应用程序在并发执行,故可能会产生新的垃圾对象,或者原来的垃圾对象重新变为可达,故在该阶段暂停应用,然后对在并发标记阶段中状态发生了变化的对象进行重新标记,此过程涉及到整个堆中,即从GC roots引用的对象出发,对新生代和老年代中发生了变化的对象进行重新标记。具体remark阶段的执行时间,可以通过GC日志的CMS-remark日志内存来查看。
  5. 并发清除:将以上过程没有被标记为可达的对象进行清除,此阶段是与应用程序并发执行的;
  6. 并发重置:对该次CMS垃圾回收中的数据结构进行重置,以便下次进行CMS。

日志分析

  • 以上过程的执行时间都可以通过配置:-XX:+PrintGCDetails,来打印详细的GC日志来查看,如下:

    [GC [ParNew: 839977K->1563K(943744K), 0.0048690 secs] 994555K->156183K(3040896K), 0.0052340 secs] [Times: user=0.02 sys=0.01, real=0.01 secs] 
    
    [GC [1 CMS-initial-mark: 629255K(2097152K)] 631951K(3040896K), 0.0066920 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
    [CMS-concurrent-mark: 1.385/1.385 secs] [Times: user=4.80 sys=0.29, real=1.38 secs] 
    [CMS-concurrent-preclean: 0.008/0.008 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
    [GC [ParNew: 840863K->2737K(943744K), 0.0079350 secs] 1470119K->632187K(3040896K), 0.0084240 secs] [Times: user=0.03 sys=0.01, real= 
    0.01 secs] 
    [CMS-concurrent-abortable-preclean: 0.646/1.471 secs] [Times: user=2.48 sys=0.27, real=1.47 secs] 
    [GC[YG occupancy: 424421 K (943744 K)][Rescan (parallel) , 0.0519000 secs][weak refs processing, 0.0017730 secs] [1 CMS-remark: 6294 
    50K(2097152K)] 1053871K(3040896K), 0.0538830 secs] [Times: user=0.32 sys=0.01, real=0.05 secs] 
    [CMS-concurrent-sweep: 0.971/0.971 secs] [Times: user=2.06 sys=0.19, real=0.97 secs] 
    [CMS-concurrent-reset: 0.012/0.012 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
    

优缺点

  • CMS垃圾回收的特点是应用程序可以并发执行,所以应用停顿时间较短,实现了高响应时间的目的。缺点方面除了需要消耗较多的CPU资源外,由于是基于标记清除算法,故会造成内存碎片。为了解决内存碎片问题,CMS提供了JVM参数:-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=1,来配置在进行了Full GC时,对老年代进行压缩整理,处理掉内存碎片,其中CMSFullGCsBeforeCompaction配置进行了多少次Full GC之后执行一次内存压缩。
  • 与Parallel一样,也可以通过:-XX:ParallelGCThreads来配置并行垃圾回收线程数。
  • Concurrent Mode Failure:由于CMS在执行过程中是与应用程序并发执行的,如果在此过程中,应用程序需要在老年代分配空间来存放对象,而老年代此时没有足够的空闲空间,此时会触发Concurrent Mode Failure,之后会进行一次Full GC,老年代降级为使用Serial Old垃圾回收器,此时会暂停所有的应用线程的执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值