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後對內存空間進行壓縮整理。