深刻理解java虛擬機——垃圾收集器參數總結與GC日誌

垃圾收集相關的經常使用參數
參數 描述
-XX:+UseSerialGC 虛擬機運行在Client模式下的默認值,打開此開關後,使用Serial+Serial Old的收集器組合進行內存回收
UseParNewGC 打開此開關後,使用ParNew+SerialOld的收集器組合進行內存回收
UseConcMarkSweepGC 打開此開關後,使用ParNew+CMS+Serial Old的收集器組合進行內存回收。Serial Old收集器將做爲CMS收集器出現Concurrent Mode Failure失敗後的後備收集器使用
UseParallelGC 虛擬機運行在Server模式下的默認值,打開此開關後,使用Parallel Scavenge+Serial Old(PS MarkSweep)的收集器組合進行內存回收
UseParallelOldGC 打開此開關後,使用Parallel Scavenge+Parallel Old的收集器組合進行內存回收
SurvivorRatio 新生代中Eden區與Survivor區的容量比值,默認爲8,表明Eden:Survivor=8:1
PretenureSizeThreshold 直接晉升到老年代的對象大小,設置這個參數後,大於這個參數的對象將直接在老年代分配
MaxTenuringThreshold 晉升到老年代的對象年齡。每一個對象在堅持過一次Minor GC以後,年齡就增長1,當超過這個參數值時就進入老年代
UseAdaptiveSizePolicy 動態調整java堆中各個區域的大小以及進入老年代的年齡
HandlePromotionFailure 是否容許分配擔保失敗,即老年代的剩餘空間不足以應付新生代的整個Eden和Survivor區的全部對象都存活的極端狀況
ParallelGCThreads 設置並行GC時進行內存回收的線程數
GCTimeRatio GC時間佔總時間的比率,默認值爲99,即容許1%的GC時間,盡在使用Parallel Scavenge收集器時生效
MaxGCPauseMillis 設置GC的最大停頓時間。僅在使用Parallel Scavenge收集器時生效
CMSInitiatingOccupancyFraction 設置CMS收集器在老年代空間被使用多少後觸發垃圾收集。默認值爲68%,僅在使用CMS收集器時生效
UseCMSCompactAtFullCollection 設置CMS收集器在完成垃圾收集後是否要進行一次內存碎片整理。盡在使用CMS收集器時生效
CMSFullFCsBeforeCompaction 設置CMS收集器在進行若干次垃圾收集後再啓動一次內存碎片整理。僅在使用CMS收集器時生效

理解GC日誌java

33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K->152K(11904K), 0.0031680 secs]    
100.667: [Full GC [Tenured: 0K->210K(10240K), 0.0149142 secs] 4603K->210K(19456K), [Perm : 2999K->2999K(21248K)], 0.0150007 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]

最前面的數字「33.125:」和「100.667:」表明了GC發生的時間,這個數字的含義是從Java虛擬機啓動以來通過的秒數。

    GC日誌開頭的「[GC」和「[Full GC」說明了此次垃圾收集的停頓類型,而不是用來區分新生代GC仍是老年代GC的。若是有「Full」,說明此次GC是發生了Stop-The-World的。
    例以下面這段新生代收集器ParNew的日誌也會出現「[Full GC」(這通常是由於出現了分配擔保失敗之類的問題,因此才致使STW)。若是是調用System.gc()方法所觸發的收集,那麼在這裏將顯示「[Full GC (System)」。多線程

[Full GC 283.736: [ParNew: 261599K->261599K(261952K), 0.0000288 secs]

接下來的「[DefNew」、「[Tenured」、「[Perm」表示GC發生的區域,這裏顯示的區域名稱與使用的GC收集器是密切相關的,例如上面樣例所使用的Serial收集器中的新生代名爲「Default New Generation」,因此顯示的是「[DefNew」。若是是ParNew收集器,新生代名稱就會變爲「[ParNew」,意爲「Parallel New Generation」。若是採用Parallel Scavenge收集器,那它配套的新生代稱爲「PSYoungGen」,老年代和永久代同理,名稱也是由收集器決定的。

    後面方括號內部的「3324K->152K(3712K)」含義是「GC前該內存區域已使用容量-> GC後該內存區域已使用容量 (該內存區域總容量)」。而在方括號以外的「3324K->152K(11904K)」表示「GC前Java堆已使用容量 -> GC後Java堆已使用容量 (Java堆總容量)」。

    再日後,「0.0025925 secs」表示該內存區域GC所佔用的時間,單位是秒。有的收集器會給出更具體的時間數據,如「[Times: user=0.01 sys=0.00, real=0.02 secs]」,這裏面的user、sys和real與Linux的time命令所輸出的時間含義一致,分別表明用戶態消耗的CPU時間、內核態消耗的CPU事件和操做從開始到結束所通過的牆鍾時間(Wall Clock Time)。CPU時間與牆鍾時間的區別是,牆鍾時間包括各類非運算的等待耗時,例如等待磁盤I/O、等待線程阻塞,而CPU時間不包括這些耗時,但當系統有多CPU或者多核的話,多線程操做會疊加這些CPU時間,因此讀者看到user或sys時間超過real時間是徹底正常的。
 spa

相關文章
相關標籤/搜索