垃圾收集器--CMS垃圾收集器(响应时间优先)

垃圾收集器–CMS垃圾收集器(老年代)

CMS是针对于响应时间优先的垃圾收集器

老年代的CMS一般搭配两个另外两个垃圾收集器:
1、ParNewGC (新生代)
2、SerialOld(老年代出现异常时,CMS退化为SerialOld)

一、ParNewGC (新生代垃圾收集器,并行GC)

ParNew收集器其实就是Serial收集器的多线程版本,除了了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与 Serial收集器完全一样,在实现上,这两种收集器也共用了相当多的代码。

特性 :

Serial收集器器的多线程版本
多线程
复制算法
Stop The World(STW)

应用场景 :

ParNew收集器是许多运行在Server模式下的虚拟机中首选的新生代收集器,
搭配CMS收集器,在用户体验优先的程序中使用:ParNew是运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关但很重要的原因是,除了Serial收集器外,目前只有它能与CMS收集器配合工作

优势

相比单CPU环境,随着可以使用的CPU的数量的增加,它对于GC时系统资源的有效利用还是很有好处的
提高了cpu的利用率。

对比分析:

与Serial收集器对比:
ParNew收集器在单CPU的环境中绝对不会有比Serial收集器更更好的效果,甚至由于存在线程交互的开销,该收集器在通过多线程技术实现的两个CPU的环境中都不能百分之百地保证可以超越Serial收集 器。
然而,随着可以使用的CPU的数量量的增加,它对于GC时系统资源的有效利用还是很有好处的。

二、CMS垃圾收集器(老年代)

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。

CMS收集器是基于“标记—清除”算法实现的,整个过程分为4个步骤:

在这里插入图片描述
1、初始标记(CMS initial mark) 初始标记仅只是标记一下GC Roots能直接关联到的对象,速度很快,需要“Stop The World”。
2、并发标记(CMS concurrent mark) 并发标记阶段就是进行GC Roots Tracing的过程
3、重新标记重新标记阶段是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些但远比并发标记的时间短,仍然需要“Stop The World”。
4、并发清除(CMS concurrent sweep) 并发清除阶段会清除对象。

注意:由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所
以,从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

应用场景

目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。

优点

并发收集、低停顿
“标记-清除”算法

缺点

  1. CMS会抢占CPU资源。并发标记阶段虽然不会导致用户线程暂停,但却需要CPU分出精力去执行多条
    垃圾收集线程,从而使得用户线程的执行速度下降

  2. CMS无法处理浮动垃圾(Floating Garbage),可能会出现“Concurrent Mode Failure”而导致另
    一次Full GC:
    并发清理的过程中,由于用户线程还在执行,因此就会继续产生对象和垃圾,这些新的垃圾没有被标记,CMS只能在下一次收集中处理它们。这也导致了CMS不能在老年代几乎完全被填满了再去进行收集,必须预留一部分空间提供给并发收集时程序运作使用。在JDK1.5默认设置下,老年代使用了68%(JDK1.6是92%)的空间后CMS的垃圾收集就会被激活,其实这是一个比较保守的设置,只要应用中老年代增长不是很快,可以适当地调高参数-XX:CMSInitialingOccupancyFraction来提高触发百分比,降低回收的频率来获得更好的性能。如果CMS在收集期间,内存无法满足程序的需要,就会出现“Concurrent Mode Failure”,这时JVM将临时调用单线程的Serial Old收集器来重新进行老年代的垃圾收集,这样的话,CMS原本降低停顿时间的目的不仅没完成,和直接使用Serial Old收集器相比,还增加了前面几个阶段的停顿时间

  3. CMS的“标记-清除”算法,会导致大量空间碎片的产生
    碎片的积累会给分配大对象带来麻烦,往往会出现明明老年代还有很多空间剩余,但是却无法找到连续的空间分配对象的情况,这时候就不得不触发一次Full GC。
    为了解决这个问题。CMS提供了一个-XX:+UseCMSCompactAtFullCollection的开关参数(默认是开启的)用于在CMS收集器进行Full GC时对内存碎片进行合并整理,整理的过程是需要暂停用户线程的,这样碎片虽然没有了,但停顿时间又变长了。
    CMS的设计初衷可是降低停顿,于是又提供了一个参数-XX:CMSFullGCsBeforeCompaction,用于设置执行多少次不压缩碎片的Full GC后,跟着来一次带压缩的Full GC(默认值为0,即每次都会)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值