理解GC日誌
PS : 本文乃學習整理參考而來
以下是案例輸出:
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.015007 secs] [Times:user=0.01 sys=0.00,real=0.02 secs]
最前面的數字“33.125”和“100.667”代表了GC發生的時間,這個數字的含義是Java虛擬啓動以來經過的秒數。
“[GC”和“[Full GC” 代表這次垃圾收集的停頓類型,而不是用來區分新生代GC還是老年代GC的。如果有“Full”說明這次GC是發生過Stop The World。
如下這段新生代收集器ParNew的日誌也會出現“[Full GC”(這一般是因爲出現了分配擔保失敗之類的問題,導致了STW)。
[Full GC 283.736:[ParNew:261599K->261599K(261952K),0.0000288 secs]]
接下來的“[DefNew”、“[Tenured”、“[Perm”表示GC發生的區域,這裏顯示的區域名稱與使用的GC收集器是密切相關的,例如上面所使用的Serail收集器中的新生代名爲“Default New Generation”,所以顯示的是“[DefNew”。如果是ParNew收集器,新生代名稱變爲“[ParNew”,意味“Parallel New Generation”。如果採用Parallel Scavenge收集器,那它配套的新生代爲“PSYoungGen”。
後面方括號內部的“3324K->152K(3712K)”含義是“GC前該內存區域已使用的容量->GC後該內存區域已使用的容量(該內存區域總容量)”。而在方括號之外的“3324K->152(11904K)”表示“GC前Java堆已使用容量->GC後Java堆已使用容量(Java堆總容量)”。再往後“0.0025925”表示該內存區域GC所佔用的時間,單位是秒。
有的收集器會給出更具體時間數據。如:“[Times:user=0.01 sys=0.00 ,real=0.02 secs]”這裏面的user、sys、real與Linux的time命令說輸出的時間含義一致,分別代表用戶態消耗的CPU時間、內核態消耗的CPU時間和操作從開始到結束所經過的牆鍾(Wall Clock Time)。