CMS
是一个很好的并发垃圾收集器,可是使用过程当中会产生两个重要的问题。该问题发生在Minor GC
过程当中,Survivor Space
放不下转移的对象,老年代也放不下(promotion failed发生的时候老年代CMS尚未机会进行回收,又放不下转移到老年代的对象,下一步就会产生concurrent mode fialure
,发生STW降级为Serial Old)下面是一条
promotion failed
失败的日志并发
106.641: [GC 106.641: [ParNew (promotion failed): 14784K->14784K(14784K), 0.0370328 secs]106.678: [CMS106.715: [CMS-concurrent-mark: 0.065/0.103 secs] [Times: user=0.17 sys=0.00, real=0.11 secs] (concurrent mode failure): 41568K->27787K(49152K), 0.2128504 secs] 52402K->27787K(63936K), [CMS Perm : 2086K->2086K(12288K)], 0.2499776 secs] [Times: user=0.28 sys=0.00, real=0.25 secs]
concurrent mode failure
是CMS
特有的错误,CMS
的垃圾清理线程和用户线程是并行进行的. 老年代正在清理,从年轻代晋升了新对象,或者分配的大对象在新生代放不下,直接在老年代分配内存,这时老年代也放不下,则会抛出concurrent mode failure
老年代的垃圾收集器从CMS
退化成Serial Old
,全部用户线程被暂停,停顿时间变长。
-XX:CMSInitiatingOccupancyFraction=N
是指设定CMS在对内存占用率达到N%的时候开始GC(由于CMS会有浮动垃圾,因此通常都较早启动GC);
-XX:CMSInitiatingOccupancyFraction=N
调小
开启空间碎片整理,并将空间碎片整理周期设置在合理范围,-
XX:CMSFullGCsBeforeCompaction
做用:设置在执行多少次Full GC后对内存空间进行压缩整理。