- 典型的GC日志:
33.125: [GC[DefNew: 3324K -> 152K (3712K), 0.0025925 secs] 3324K -> 152K(11904K), 0.031680 secs]
100.667: [Full GC[Tenured: 0K -> 210K], 0.0149142 secs] 4603K -> 210K(19456K), [Perm: 2999K -> 2999K(21248K)], 0.0150007 secs] [times: user=0.01 sys=0.00, real=0.02 secs]
前面的數(shù)字“33.125:” 和“100.667:”代表了GC發(fā)生的時間恩商,這個數(shù)字的含義是從Java虛擬機啟動以來經(jīng)過的秒數(shù)。
GC日志開頭的“[GC”和“[Full GC”說明了這次垃圾收集的停頓類型必逆,而不是用來區(qū)分新生代GC還是老年代GC的怠堪。如果有“Full”,說明這次GC是發(fā)生了Stop-The-World的名眉,例如下面這段新生代收集器ParNew的日志也會出現(xiàn)“[Full GC”(這一般是因為出現(xiàn)了分配擔(dān)保失敗之類的問題粟矿,所以才導(dǎo)致STW)。如果是調(diào)用System.gc()方法所觸發(fā)的收集损拢,那么在這里將顯示“[Full GC(System)”陌粹。
[Full GC 283.734: [ParNew: 261559K -> 261559K(261952K), 0.0000028 secs]
接下來的“[DefNew”、“[Tenured”福压、“[Perm”表示GC發(fā)生的區(qū)域掏秩,這里顯示的區(qū)域名稱與使用GC收集器是密切相關(guān)的,例如上面樣例所使用的Serial收集器中的新生代名為“Default New Generation”荆姆,所以顯示的是“[DefNew”蒙幻。如果是ParNew收集器,新生代的名稱就會變?yōu)椤癧ParNew”胆筒,意為“Parallel New Generation”邮破。如果采用Parallel Scavenge收集器,那它配套的新生代稱為“PSYoungGen”,老年代和永久代同理腐泻,名稱也是由收集器決定的决乎。
后面方括號內(nèi)部的“3324K -> 152K(3712K)”含義是“GC前該內(nèi)存區(qū)域已使用容量 -> GC后該內(nèi)存區(qū)域已使用容量(該內(nèi)存區(qū)域總?cè)萘浚倍友6诜嚼ㄌ栔獾摹?324K -> 152K(11904K)”表示“GC前Java堆已使用容量 -> GC后Java堆已使用容量(Java堆總?cè)萘浚薄?br>
再往后派桩,“0.0025925 secs”表示該內(nèi)存區(qū)域GC所占用的時間,單位是秒蚌斩。有的收集器會給出更具體的時間數(shù)據(jù)铆惑,如“[Times:user=0.01 sys=0.00, real=0.02 secs]”,這里面的user、sys和real與Linux的time命令所輸出的時間含義一致员魏,分別代表用戶態(tài)消耗的CPU時間丑蛤、內(nèi)核態(tài)消耗的CPU事件和操作從開始到結(jié)束所經(jīng)過的墻鐘時間(Wall Clock Time)。CPU時間與墻鐘時間的區(qū)別是撕阎,墻鐘時間包括各種非運算的等待耗時受裹,例如等待磁盤I/0、等待線程阻塞虏束,而CPU時間不包括這些耗時棉饶,但當(dāng)系統(tǒng)有很多CPU或者多核的話,多線程操作會疊加這些CPU時間镇匀,所以我們看到user或sys時間超過real時間是完全正常的照藻。