2015-10-07 34 views
3

我面臨併發模式故障發生,由於我的應用程序響應緩慢。正如我看到許多博客建議降低佔用率值並檢查,這是併發模式失敗的唯一解決方案嗎?併發模式故障,而完全GC



    CMS: abort preclean due to time 2015-09-16T23:18:41.306+0200: 3847212.463: [CMS-concurrent-abortable-preclean: 4.934/5.444 secs] [Times: user=5.00 sys=0.01, real=5.45 secs] 
    2015-09-16T23:18:41.311+0200: 3847212.467: [GC[YG occupancy: 266211 K (436928 K)]3847212.467: [Rescan (parallel) , 0.1478990 secs]3847212.615: [weak refs processing, 0.0000180 secs] [1 CMS-remark: 3073996K(4718592K)] 3340208K(5155520K), 0.1480950 secs] [Times: user=1.57 sys=0.01, real=0.15 secs] 
    2015-09-16T23:18:41.460+0200: 3847212.616: [CMS-concurrent-sweep-start] 
    2015-09-16T23:18:44.204+0200: 3847215.360: [CMS-concurrent-sweep: 2.738/2.744 secs] [Times: user=2.76 sys=0.00, real=2.74 secs] 
    2015-09-16T23:18:44.204+0200: 3847215.360: [CMS-concurrent-reset-start] 
    2015-09-16T23:18:44.215+0200: 3847215.371: [CMS-concurrent-reset: 0.010/0.010 secs] [Times: user=0.01 sys=0.00, real=0.02 secs] 
    2015-09-16T23:18:46.221+0200: 3847217.377: [GC [1 CMS-initial-mark: 3073996K(4718592K)] 3347513K(5155520K), 0.3326130 secs] [Times: user=0.33 sys=0.00, real=0.33 secs] 
    2015-09-16T23:18:46.554+0200: 3847217.710: [CMS-concurrent-mark-start] 
    2015-09-16T23:18:46.926+0200: 3847218.083: [Full GC 3847218.083: [CMS2015-09-16T23:18:50.249+0200: 3847221.405: [CMS-concurrent-mark: 3.688/3.695 secs] [Times: user=13.96 sys=0.31, real=3.70 secs] 
    (concurrent mode failure): 3073996K->3011216K(4718592K), 20.7183280 secs] 3348996K->3011216K(5155520K), [CMS Perm : 262143K->40538K(262144K)], 20.7185010 secs] [Times: user=29.87 sys=0.31, real=20.71 secs] 
    2015-09-16T23:27:27.701+0200: 3847738.857: [GC 3847738.858: [ParNew: 349568K->28669K(436928K), 0.0532300 secs] 3360784K->3039885K(5155520K), 0.0534380 secs] [Times: user=0.14 sys=0.00, real=0.05 secs] 
    2015-09-16T23:33:43.242+0200: 3848114.399: [GC 3848114.399: [ParNew: 378237K->14730K(436928K), 0.0492570 secs] 3389453K->3025946K(5155520K), 0.0494510 secs] [Times: user=0.14 sys=0.00, real=0.05 secs] 
    2015-09-16T23:41:35.879+0200: 3848587.035: [GC 3848587.035: [ParNew: 364298K->15247K(436928K), 0.0524070 secs] 3375514K->3026463K(5155520K), 0.0525940 secs] [Times: user=0.15 sys=0.00, real=0.05 secs] 

以下是JVM參數設置:



    -server 
    -d64 
    -Xms2048M 
    -Xmx2048M 
    -XX:+DisableExplicitGC 
    -XX:NewSize=512M 
    -XX:MaxNewSize=512M 
    -XX:SurvivorRatio=4 
    -XX:PermSize=256M 
    -XX:MaxPermSize=256M 
    -XX:+UseParNewGC 
    -XX:+UseConcMarkSweepGC 
    -XX:CMSInitiatingOccupancyFraction=65 
    -XX:+UseCMSInitiatingOccupancyOnly 
    -XX:+CMSPermGenSweepingEnabled 
    -XX:MaxTenuringThreshold=30 

+0

你讀過這篇文章:http://stackoverflow.com/questions/2918124/how-to-reduce-java-concurrent-mode-failure-and-excessive-gc – assylias

+0

是的,我已經走了,但仍然是我我無法弄清楚 – ashu

+0

如果你已經經歷了這個,你究竟試過了什麼?和什麼Java版本?多少核心?並且可以提供完整的GC日誌(上傳/粘貼它們)? – the8472

回答

1

既然你有CMSInitiatingOccupancyFraction設置爲65%的事實,如果你需要進一步降低它的任何我會感到很驚訝。根據您上傳的日誌,似乎您的問題的強有力候選人是預清潔階段。從你的日誌,我看到開頭的幾個消息:

CMS:預洗中止由於時間

這意味着的是,併發預洗階段(在您的CMS GC基本上沒有的東西加速並減少後來停止世界暫停的可能性)正在中止,因此停止世界暫停將比他們需要的更頻繁。

因此,您應該考慮增加預清潔階段的超時時間。這可以通過手動將-XX:CMSMaxAbortablePrecleanTime JVM參數設置爲大於5秒來完成。

我對此做了一點研究,並且在"abort preclean due to time"問題上已經有了一個很好的StackOverflow Q/A。還有一個不錯的Oracle博客詳細介紹了CMS收集器的不同階段,包括描述what the CMS collector's preclean phase actually does。最後的參考資料詳述了syntax of the CMSMaxAbortablePrecleanTime JVM parameter

在附註中,您有幾個適用於您的JVM的調整參數。雖然他們可能有助於表現,但他們也可能不會。實際上,設置多個JVM參數通常會限制JVM爲您的自定義應用程序優化垃圾回收的能力。考慮嘗試刪除一些這些調整參數以改善您的性能問題。