我有一個應用程序,導致創建大量的垃圾。首先(幾乎是一個)標準是低GC暫停時間。我使用visualgc工具(和gc日誌)嘗試不同的GC參數。最佳參數如下。Java CMS GC行爲
-XX:+ UseConcMarkSweepGC
-Xmx1172M
-Xms600M
-XX:+ UseParNewGC
-XX:新尺寸= 150M
我的申請使用Java 1.6.0_21在SunOS 10上運行。硬件是2個CPU四核(uname -X結果是numCPU = 8)。
問題是
觀察GC行爲,新創建的對象上伊甸園空間,直到伊甸園已滿。當伊甸園空間完整的GC運行時,清除垃圾,如果對象沒有死亡複製到舊版本(我'丟棄'從'&'到'空格),類似的舊版本已滿,GC運行CMS併發階段並清除舊的-gen空間。 CMS的某些部分是停止世界(暫停時間)。這是一個循環。
- 以上scenerio是真的嗎?
- GC清理舊版空間後,沒有足夠的空間擴展舊版空間(XMS和XMS值不同)?
- 完整的GC操作何時開始?如何決定?
- CMS併發階段持續時間取決於伊甸園空間大小,實際上我的預期是,伊甸園空間不影響CMS併發階段持續時間。與CMS-併發階段上的eden空間相關的GC發生了什麼?
- 還有什麼建議我最大限度地減少暫停時間?事實上,我覺得最有價值的答案:)
感謝
經過20個小時,gc記錄了大約5倍的完整gc運行,我猜想一些線索爲什麼運行Full GC是「升級失敗」和「併發模式失敗」。在google上搜索這些原因。稍後,爲「促銷失敗」增加舊一代大小,併爲「併發模式失敗」設置最小值XX:CMSInitiatingOccupancyFraction。我會嘗試設置XX:CMSInitiatingOccupancyFraction小值(如30或60)並增加堆。我會分享測試結果。 – 2011-03-17 09:59:23
促銷失敗通常是我提到的碎片問題,它強制一個非併發的完整gc。你需要檢查你的持續時間門檻並適當調整他們的大小。將初始佔用設置爲較低值(默認值爲70 iirc)意味着更頻繁的完整gcs,這些gcs不會做太多,這並不好。你甚至有很多這樣的生活很長一段時間?你可能會發現一個巨大的伊甸園,一個小的終身制是一個不錯的選擇。 – Matt 2011-03-17 10:09:36
較低的啓動佔用值是CMS更常見的,但沒有問題。最大的問題STW,而2-3秒。吞吐量或0.0x秒STW對我來說不是問題。我已經嘗試過大的伊甸園大小,但是STW的持續時間增加了:(如何設置併發階段的線程數? – 2011-03-17 12:03:38