JVM調優——之CMS 常見參數解析

   最近在學習使用CMS這個GC,這裏記錄下經常使用的參數。算法

1. UseCMSCompactAtFullCollection 與 CMSFullGCsBeforeCompaction併發

     有一點須要注意的是:CMS併發GC不是「full GC」。HotSpot VM裏對concurrent collection和full collection有明確的區分。全部帶有「FullCollection」字樣的VM參數都是跟真正的full GC相關,而跟CMS併發GC無關的。
CMSFullGCsBeforeCompaction這個參數在HotSpot VM裏是這樣聲明的:       學習

product(bool, UseCMSCompactAtFullCollection, true,                     \
        "Use mark sweep compact at full collections")                  \
                                                                       \
product(uintx, CMSFullGCsBeforeCompaction, 0,                          \
        "Number of CMS full collection done before compaction if > 0") \

而後這樣使用的:ui

  *should_compact =
    UseCMSCompactAtFullCollection &&
    ((_full_gcs_since_conc_gc >= CMSFullGCsBeforeCompaction) ||
     GCCause::is_user_requested_gc(gch->gc_cause()) ||
     gch->incremental_collection_will_fail(true /* consult_young */));


CMS GC要決定是否在full GC時作壓縮,會依賴幾個條件。其中,
第一種條件,UseCMSCompactAtFullCollection 與 CMSFullGCsBeforeCompaction 是搭配使用的;前者目前默認就是true了,也就是關鍵在後者上。
第二種條件是用戶調用了System.gc(),並且DisableExplicitGC沒有開啓。
第三種條件是young gen報告接下來若是作增量收集會失敗;簡單來講也就是young gen預計old gen沒有足夠空間來容納下次young GC晉升的對象。
上述三種條件的任意一種成立都會讓CMS決定此次作full GC時要作壓縮。

CMSFullGCsBeforeCompaction 說的是,在上一次CMS併發GC執行事後,到底還要再執行多少次full GC纔會作壓縮。默認是0,也就是在默認配置下每次CMS GC頂不住了而要轉入full GC的時候都會作壓縮。 把CMSFullGCsBeforeCompaction配置爲10,就會讓上面說的第一個條件變成每隔10次真正的full GC才作一次壓縮(而不是每10次CMS併發GC就作一次壓縮,目前VM裏沒有這樣的參數)。這會使full GC更少作壓縮,也就更容易使CMS的old gen受碎片化問題的困擾。 原本這個參數就是用來配置下降full GC壓縮的頻率,以期減小某些full GC的暫停時間。CMS回退到full GC時用的算法是mark-sweep-compact,但compaction是可選的,不作的話碎片化會嚴重些但此次full GC的暫停時間會短些;這是個取捨。spa

2. -XX:CMSInitiatingOccupancyFraction=70 和-XX:+UseCMSInitiatingOccupancyOnlycode

    這兩個設置通常配合使用,通常用於『下降CMS GC頻率或者增長頻率、減小GC時長』的需求對象

   -XX:CMSInitiatingOccupancyFraction=70 是指設定CMS在對內存佔用率達到70%的時候開始GC(由於CMS會有浮動垃圾,因此通常都較早啓動GC);blog

   -XX:+UseCMSInitiatingOccupancyOnly 只是用設定的回收閾值(上面指定的70%),若是不指定,JVM僅在第一次使用設定值,後續則自動調整.內存

3. -XX:+CMSScavengeBeforeRemarkci

   在CMS GC前啓動一次ygc,目的在於減小old gen對ygc gen的引用,下降remark時的開銷-----通常CMS的GC耗時 80%都在remark階段

 

 

相關文章
相關標籤/搜索