1. 程式人生 > >JVM GC日誌(一)

JVM GC日誌(一)

1.JVM啟動引數

-Xloggc:D:/gc.log   日誌檔案儲存的路徑
-XX:+PrintGCDetails     列印回收詳情
-XX:+PrintGCTimeStamps  列印JVM執行時間
-XX:+UseSerialGC  指定JVM使用序列垃圾收集器

2.執行程式碼

public class SimpleGc {
    public static void main(String[] args) {
        List<byte[]> l=new ArrayList<byte[]>();
        for(int i=0;i<1000000
;i++){ byte[] bytes= new byte[64]; l.add(bytes); if(l.size()*64/1024/1024>13){ l.clear(); } } } }

3.輸出日誌
這樣配置以後,發生GC時輸出的日誌就類似於下面這種格式(為了顯示方便,已手動換行):

0.341: [GC (Allocation Failure) 
    0.341:[DefNew: 34944K->4352K(39296
K), 0.0235464 secs] 34944K->13487K(126720K), 0.0237237 secs] [Times: user=0.00 sys=0.01, real=0.02 secs] 0.381: [GC (Allocation Failure) 0.381: [DefNew: 39296K->4351K(39296K), 0.0197736 secs] 48431K->21422K(126720K), 0.0198706 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]

這個日誌片段中發生了 2 次垃圾回收事件(Garbage Collection events)。兩次清理的都是年輕代(Young generation)。下面我們來看,如何解讀第一次GC事件,發生在年輕代中的小型GC(Minor GC):
這裡寫圖片描述

1.0.341 GC時間的開始時間,相對於JVM的啟動時間,單位是秒(Measured in seconds)

2.GC 用來區分(distinguish)是 Minor GC 還是 Full GC 的標誌(Flag). 這裡的 GC 表明本次發生的是 Minor GC

3.Allocation Failure 引起垃圾回收的原因. 本次GC是因為年輕代中沒有任何合適的區域能夠存放需要分配的資料結構而觸發的

4.DefNew 使用的垃圾收集器的名字. DefNew 這個名字代表的是: 單執行緒(single-threaded), 採用標記複製(mark-copy)演算法的, 使整個JVM暫停執行(stop-the-world)的年輕代(Young generation) 垃圾收集器(garbage collector)

5.34944K->4352K 在本次垃圾收集之前和之後的年輕代記憶體使用情況(Usage)

6.(39296K) 年輕代的總的大小(Total size)

7.34944K->13487K 在本次垃圾收集之前和之後整個堆記憶體的使用情況(Total used heap)

8.(126720K) 總的可用的堆記憶體(Total available heap)

9.0.0237237 secs GC事件的持續時間(Duration),單位是秒

10.[Times: user=0.00 sys=0.01, real=0.02 secs] GC事件的持續時間,通過多種分類來進行衡量
(1)user – 此次垃圾回收, 垃圾收集執行緒消耗的所有CPU時間(Total CPU time)
(2)sys – 作業系統呼叫(OS call) 以及等待系統事件的時間(waiting for system event)
(3)real – 應用程式暫停的時間(Clock time). 由於序列垃圾收集器(Serial Garbage Collector)只會使用單個執行緒, 所以 real time 等於 user 以及 system time 的總和.

通過上面的分析, 我們可以計算出在垃圾收集期間, JVM 中的記憶體使用情況。在垃圾收集之前, 堆記憶體總的使用了 34.125M (34,944K)。其中, 年輕代也是34.125M(34,944K)。可以算出老年代使用的記憶體為0。

垃圾回收後,年輕帶的記憶體下降了29.8M(30,592K),但總的堆記憶體使用(total heap usage)只減少了 20.9M(21457k) .通過這一點,我們可以計算出, 有 8.9M(9135K) 的年輕代物件被提升到老年代(Old)中。

這個GC事件可以用下面的示意圖來表示, 上方表示GC之前的記憶體使用情況, 下方表示結束後的記憶體使用情況:
這裡寫圖片描述