兩段GC日志:
33.125:[GC[DefNew:3324K->152K(3712K),0.0025925 secs]3324K->152K(11904K),0.0031680 secs]
1 0 0.6 6 7:[F u l l G C[T e n u r e d:0 K->2 1 0 K(1 0 2 4 0 K),0.0 1 4 9 1 4 2 s e c s]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的。如果是調(diào)用System.gc()方法所觸發(fā)的收集,那么在這里將 顯示“[Full GC(System)”。
接下來的“[DefNew”、“[Tenured”、“[Perm”表示GC發(fā)生的區(qū)域,這里顯示的區(qū)域名稱與 使用的GC收集器是密切相關(guān)的,例如上面樣例所使用的Serial收集器中的新生代名為“Default New Generation”,所以顯示的是“[DefNew”。如果是ParNew收集器,新生代名稱就會變 為“[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è)?量)”。
再往后,“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/O、等待線程阻 塞,而CPU時間不包括這些耗時,但當(dāng)系統(tǒng)有多CPU或者多核的話,多線程操作會疊加這些 CPU時間,所以讀者看到user或sys時間超過real時間是完全正常的。