前言
每一種收集器的日志形式都由他們自身實現(xiàn)所決定的庞呕,所以會不同,但是一般大家都會維持一定的共性霞丧。
日志解讀
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.0149142secs]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發(fā)生時間(從java虛擬機啟動以來經(jīng)過的秒數(shù))怔昨。
- 日志開頭“[GC ”和“[Full GC”說明了這次垃圾收集的停頓類型。有"Full"說明這次GC是發(fā)生了Stop-The-World的宿稀。一般因為出現(xiàn)了分配擔(dān)保失敗之類的問題才會導(dǎo)致STW趁舀。如果調(diào)用System.gc()方法所觸發(fā)的收集,那么這里將顯示“[Full GC(System)”祝沸。
- “ [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è)萘浚薄?/li>
- 再往后此衅,“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時間是完全正常的。
GC日志理解
- **注:Minor GC和Full GC有什么不一樣嗎氓奈?
新生代GC(Minor GC):指發(fā)生在新生代的垃圾收集動作翘魄,因為Java對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁舀奶,一般回收速度也比較快暑竟。
老年代GC(Major GC/Full GC):指發(fā)生在老年代的GC,出現(xiàn)了Major GC育勺,經(jīng)常會伴隨至少一次的Minor GC(但非絕對的但荤,在Parallel Scavenge收集器的收集策略里就有直接進行Major GC的策略選擇過程)。Major GC的速度一般會比Minor GC慢10倍以上怀大。
**