CMS收集器 Concurrent Markup Sweep 并发标记清除
 使用了标记-清除算法 与标记-压缩相比,并发阶段会降低吞吐量
 算法作用在老年代以及永久区(新生代使用ParNew)
 -XX:+UseConcMarkSweepGC
CMS运行过程
 1.初始标记(用户线程停止)
  根可以关联到的对象
  速度快
 2.并发标记(和用户线程一起)
  主要标记过程,标记全部对象
 3.重新标记(用户线程停止)
  由于并发标记时,用户线程依然进行因此在正式清理前,再做修正。
 4.并发清除(和用户线程一起)
  基于标记结果,直接清理对象
 
特点:
1.尽可能降低停顿
2.会影响系统整体吞吐量和性能
 比如,在用户线程运行过程中,分一半CPU去做CMS GC,系统性能在GC阶段,反应速度就下降一半。
3.清理不彻底。
 在清理阶段,用户线程还在执行,会产生新的垃圾,无法清理。
4.因为和用户线程一起执行,不能在空间将满时再清理。
 -XX:CMSInitiatingOccupancyFraction设置触发GC的阈值。 设定老年代空间被使用多少后触发。
 如果不幸内存预留空间不足,就会引起concurrent mode failure.
5.在CMS遇到空间不足时,可以使用串行收集器作为后备。
6.做标记清除时,可以不停止应用线程,但会产生内存碎片,而做标记压缩时,会Stop-The-World,但不会产生内存碎片。
 -XX:+UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理。
  整理过程是独占的,会引起停顿时间变长。
 
减轻GC压力 软件如何架构,代码如何写,堆空间如何分配。

1.性能的根本在应用。
2.GC参数属于微调。
3.GC参数设置不合理,会影响性能,产生大的延时。

 posted on 2017-06-25 21:59  ChaseForFuture  阅读(4833)  评论(0编辑  收藏  举报