兩段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í)間永罚,這個(gè)數(shù)字的含義是從Java 虛擬機(jī)啟動(dòng)以來(lái)經(jīng)過(guò)的秒數(shù)啤呼。
GC日志開(kāi)頭的“[GC”和“[Full GC”說(shuō)明了這次垃圾收集的停頓類(lèi)型,而不是用來(lái)區(qū)分新 生代GC還是老年代GC的呢袱。如果有“Full”官扣,說(shuō)明這次GC是發(fā)生了Stop-The-World的。如果是調(diào)用System.gc()方法所觸發(fā)的收集羞福,那么在這里將 顯示“[Full GC(System)”惕蹄。
接下來(lái)的“[DefNew”、“[Tenured”、“[Perm”表示GC發(fā)生的區(qū)域卖陵,這里顯示的區(qū)域名稱(chēng)與 使用的GC收集器是密切相關(guān)的恋昼,例如上面樣例所使用的Serial收集器中的新生代名為“Default New Generation”,所以顯示的是“[DefNew”赶促。如果是ParNew收集器液肌,新生代名稱(chēng)就會(huì)變 為“[ParNew”,意為“Parallel New Generation”鸥滨。如果采用Parallel Scavenge收集器嗦哆,那它配套 的新生代稱(chēng)為“PSYoungGen”,老年代和永久代同理婿滓,名稱(chēng)也是由收集器決定的老速。
后面方括號(hào)內(nèi)部的“3324K->152K(3712K)”含義是“GC前該內(nèi)存區(qū)域已使用容量-> GC后該內(nèi)存區(qū)域已使用容量(該內(nèi)存區(qū)域總?cè)萘浚薄6诜嚼ㄌ?hào)之外的“3324K-> 152K(11904K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆總?cè)?量)”凸主。
再往后橘券,“0.0025925 secs”表示該內(nèi)存區(qū)域GC所占用的時(shí)間,單位是秒卿吐。有的收集器會(huì) 給出更具體的時(shí)間數(shù)據(jù)旁舰,如“[Times:user=0.01 sys=0.00,real=0.02 secs]”嗡官,這里面的user箭窜、 sys和real與Linux的time命令所輸出的時(shí)間含義一致,分別代表用戶(hù)態(tài)消耗的CPU時(shí)間衍腥、內(nèi)核 態(tài)消耗的CPU事件和操作從開(kāi)始到結(jié)束所經(jīng)過(guò)的墻鐘時(shí)間(Wall Clock Time)磺樱。CPU時(shí)間與 墻鐘時(shí)間的區(qū)別是,墻鐘時(shí)間包括各種非運(yùn)算的等待耗時(shí)婆咸,例如等待磁盤(pán)I/O竹捉、等待線程阻 塞,而CPU時(shí)間不包括這些耗時(shí)尚骄,但當(dāng)系統(tǒng)有多CPU或者多核的話块差,多線程操作會(huì)疊加這些 CPU時(shí)間,所以讀者看到user或sys時(shí)間超過(guò)real時(shí)間是完全正常的乖仇。