2012-03-14 94 views
9

我感到困惑的是可以控制兩個參數時,在CMS收集踢:CMS垃圾回收器 - 它何時運行?

MaxHeapFreeRatio(70默認%)

CMSInitiatingOccupancyFraction(超過90%的默認值)

什麼每個那些參數意味着什麼?收集器何時開始(標記階段),並收集(​​清掃階段)?

回答

11

CMSInitiatingOccupancyFraction決定CMS何時開始(爲了使此選項有效,您還必須設置XX:+ UseCMSInitiatingOccupancyOnly)。 MaxHeapFreeRatio是選擇代大小的選項。

例如見...

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

併發收集一般不能加速,但可以更早開始。 當舊代中分配空間的百分比超過閾值時,併發收集開始運行。該閾值是基於併發收集器的一般經驗計算的。如果發生完整收集,可能需要更早啓動併發收集。命令行標誌CMSInitiatingOccupancyFraction可用於設置集合開始的級別。其默認值約爲68%。命令行調整值是 -XX:CMSInitiatingOccupancyFraction =

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

默認情況下,虛擬機增大或縮小堆在每個收集儘量保持的自由空間,在居住對象的比例每個集合都在特定的範圍內。該目標範圍由參數-XX:MinHeapFreeRatio =和-XX:MaxHeapFreeRatio =設置爲百分比,並且總大小由-Xms限定在以下,並且由-Xmx限定。爲32位的Solaris操作系統(SPARC平臺版)的默認參數示於該表中:

.. ..或

http://www.petefreitag.com/articles/gctuning/

-XX:MaxHeapFreeRatio - 當空閒百分比一代中的空間超過這個數值,這代就會縮小以達到這個數值。默認是70

編輯:我跑了一個測試程序,只是隨機創建字節數組映射和複製他們周圍的幾個模擬。我注意到a)分數值沒有得到尊重 - 特別是保守值(比如說50),CMS初始標記階段的入住率超過了50%,一般在70-80%左右,b)儘管如此,較小的分數值使CMS初期發生較早 (程序中使用-Xmx1536m -Xmx1536m -XX:新尺寸=512米-XX:+ UseConcMarkSweepGc + GC記錄和兩個測試參數)

我還發現這方面的老錯誤報告:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

+3

'CMSInitiatingOccupancyFraction'僅用於第1個集合,除非設置了「-XX:+ UseCMSInitiatingOccupancyOnly」。如果您沒有設置後一個開關,那麼在第一個開關之後,將使用通常的啓發式(基於運行時收集的分配統計信息)來確定何時啓動CMS。 – Matt 2012-03-14 10:16:30

+0

謝謝馬特,我補充說。 – moodywoody 2012-03-14 10:22:49

+0

從一些觀測好像幾個夜間使用率較低,直至達到90%以上並沒有踢後(也就是'CMSInitiatingOccupancy'。不過,白天它似乎並沒有等待,只要收集,但越早。這似乎對應於@Matt所說的,但在這種情況下,我想知道「通常的啓發式」是什麼,和平時間會使它休眠多久並等待> 90%的閾值。 – 2012-03-14 11:21:44