简单轻松搞定JVM----CMS收集器
CMS收集器
一、CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
在目前企业中后端用到Java时,很重视服务的响应速度,希望系统停顿的时间最短,从而能给用户带来良好的体验
从名字上就可以看出来“Mark Sweep”,CMS收集器是基于“标记-清楚”算法实现的。它的收集过程会比其他的收集器要复杂一些整体上分四个步骤:
- 初始标记(CMS initial mark)
- 并发标记(CMS concurrent mark)
- 重新标记(CMS remark)
- 并发清除(CMS concurrent sweep)
其中初始和重新标记这个两个阶段需要暂停下
初始标记仅仅只是标记下GC Roots能直接关联到的对象,速度很快
并发标记阶段就是进行GC Roots Tracing的过程。
重新标记阶段就是为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段停顿的时间会比初始标记阶段稍长,但远比并发标记阶段短。
由于整个过程中耗时最长的是并发标记和并发清楚,收集器线程都可以和用户线程一起工作,所以总体上来说,CMS收集器内存回收过程是与用户线程一起并发地执行。老年代收集器。(新生代使用ParNew)
- 优点:并发收集,停顿低
- 缺点:产生大量的空间碎片,并发阶段会降低吞吐量
参数控制:-XX:+UseConcMarkSweepGC 使用CMS收集器
-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长
-XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一次碎片整理
-XX:ParallelCMSThreads 设定CMS的线程数量(一般情况约等于可用CPU数量)