jvm垃圾回收(GC)日誌簡單理解

jvm垃圾回收(GC)日誌簡單理解

每種收集器的日誌形式都是由它們自身的實現所決定的,換言之,每種收集器的日誌格式都可以不一樣。不過虛擬機爲了方便用戶閱讀,將各個收集器的日誌都維持了一定的共性,來看下面的一段GC日誌:

[GC [DefNew: 310K->194K(2368K), 0.0269163 secs] 310K->194K(7680K), 0.0269513 secs] [Times: user=0.00 sys=0.00, real=0.03 secs] 
[GC [DefNew: 2242K->0K(2368K), 0.0018814 secs] 2242K->2241K(7680K), 0.0019172 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (System) [Tenured: 2241K->193K(5312K), 0.0056517 secs] 4289K->193K(7680K), [Perm : 2950K->2950K(21248K)], 0.0057094 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 def new generation   total 2432K, used 43K [0x00000000052a0000, 0x0000000005540000, 0x0000000006ea0000)
  eden space 2176K,   2% used [0x00000000052a0000, 0x00000000052aaeb8, 0x00000000054c0000)
  from space 256K,   0% used [0x00000000054c0000, 0x00000000054c0000, 0x0000000005500000)
  to   space 256K,   0% used [0x0000000005500000, 0x0000000005500000, 0x0000000005540000)
 tenured generation   total 5312K, used 193K [0x0000000006ea0000, 0x00000000073d0000, 0x000000000a6a0000)
   the space 5312K,   3% used [0x0000000006ea0000, 0x0000000006ed0730, 0x0000000006ed0800, 0x00000000073d0000)
 compacting perm gen  total 21248K, used 2982K [0x000000000a6a0000, 0x000000000bb60000, 0x000000000faa0000)
   the space 21248K,  14% used [0x000000000a6a0000, 0x000000000a989980, 0x000000000a989a00, 0x000000000bb60000)
No shared spaces configured.
  • 1、日誌的開頭“GC”、“Full GC”表示這次垃圾收集的停頓類型,而不是用來區分新生代GC還是老年代GC的。如果有Full,則說明本次GC停止了其他所有工作線程(Stop-The-World)。看到Full GC的寫法是“Full GC(System)”,這說明是調用System.gc()方法所觸發的GC。

  • 2、“GC”中接下來的“[DefNew”表示GC發生的區域,這裏顯示的區域名稱與使用的GC收集器是密切相關的,例如上面樣例所使用的Serial收集器中的新生代名爲“Default New Generation”,所以顯示的是“[DefNew”。如果是ParNew收集器,新生代名稱就會變爲“[ParNew”,意爲“Parallel New Generation”。如果採用Parallel Scavenge收集器,那它配套的新生代稱爲“PSYoungGen”,老年代和永久代同理,名稱也是由收集器決定的。

  • 3、後面方括號內部的“310K->194K(2368K)”、“2242K->0K(2368K)”,指的是該區域已使用的容量->GC後該內存區域已使用的容量(該內存區總容量)。方括號外面的“310K->194K(7680K)”、“2242K->2241K(7680K)”則指的是GC前Java堆已使用的容量->GC後Java堆已使用的容量(Java堆總容量)。

  • 4、再往後“0.0269163 secs”表示該內存區域GC所佔用的時間,單位是秒。最後的“[Times: user=0.00 sys=0.00 real=0.03 secs]”則更具體了,user表示用戶態消耗的CPU時間、內核態消耗的CPU時間、操作從開始到結束經過的牆鍾時間。後面兩個的區別是,牆鍾時間包括各種非運算的等待消耗,比如等待磁盤I/O、等待線程阻塞,而CPU時間不包括這些耗時,但當系統有多CPU或者多核的話,多線程操作會疊加這些CPU時間,所以如果看到user或sys時間超過real時間是完全正常的。

  • 5、“Heap”後面就列舉出堆內存目前各個年代的區域的內存情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章