理解GC日誌 -- GC常用命令與GC結果解讀
理解GC日誌 – GC常用命令與GC結果解讀
GC結果解讀
閱讀GC日誌是處理java虛擬機器記憶體問題的基礎技能,每一種收集器的日誌形式都是由它們自身的實現所決定的,換而言之,每個收集器的日誌格式都不一樣。但虛擬機器設計者為了方便使用者閱讀,將各個收集器的日誌都維持一定 的共性,例如以下兩段典型的日誌:
[GC (System.gc()) [PSYoungGen: 19712K->760K(38400K)] 19712K->768K(125952K), 0.0013102 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC ( System.gc()) [PSYoungGen: 760K->0K(38400K)] [ParOldGen: 8K->648K(87552K)] 768K->648K(125952K), [Metaspace: 3441K->3441K(1056768K)], 0.0063051 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
Heap
PSYoungGen total 38400K, used 333K [0x00000000d5c00000, 0x00000000d8680000, 0x0000000100000000)
eden space 33280K, 1% used [0x00000000d5c00000,0x00000000d5c534a8,0x00000000d7c80000)
from space 5120 K, 0% used [0x00000000d7c80000,0x00000000d7c80000,0x00000000d8180000)
to space 5120K, 0% used [0x00000000d8180000,0x00000000d8180000,0x00000000d8680000)
ParOldGen total 87552K, used 648K [0x0000000081400000, 0x0000000086980000, 0x00000000d5c00000)
object space 87552K, 0% used [0x0000000081400000,0x00000000814a2368,0x0000000086980000)
Metaspace used 3447K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 376K, capacity 388 K, committed 512K, reserved 1048576K
GC 日誌開頭的“[GC”
和“[Full GC”
說明了這次垃圾收集的停頓型別,而不是用來區 分新生代GC還是老年代GC的。如果有“Full”
,說明這次GC是發生了Stop-The-World的,例如下面這段新生代收集器ParNew的日誌也會出現“[Full GC”(這一般是因為出現了分配 擔保失敗之類的問題 .所以才導致STW)。如果是呼叫System.gc()
方法所觸發的收集,那麼在這裡將顯示“[Full GC (System)”。
[Full GC 283.736: [ParNew: 261599K->261599K(261952K), 0.0000288 secs]
接下來的“[DefNew”、“[Tenured”、“[Perm”
表示GC發生的區域,這裡顯示的區域名稱與使用的GC收集器是密切相關的,例如上面樣例所使用的Serial收集器中的新生代名為“Default New Generation”
,所以顯示的是“[DefNew”
。如果是ParNew
收集器,新生代名稱就會變為 “[ParNew”
,意為 “Parallel New Generation”
。如果採用 Parallel Scavenge
收集器,那它配套的新生代稱為“PSYoungGen”
,老年代和永久代同理,名稱也是由收集器決定的。
後面方括號內部的19712K->760K(38400K)
含義是“GC前該記憶體區域已使用容量- >GC後該記憶體區域已使用容量 (該記憶體區域總容董)”。而在方括號之外的19712K->768K(125952K)
表示GC前Java堆已使用容量->表示GC後Java堆已使用容量(ava堆總容量)
再往後0.0063051 secs
表示該記憶體區域GC所佔用的時間,單位是秒。[Times: user=0.01 sys=0.00, real=0.01 secs]
中的user sys real
分別代表使用者態、核心態消耗的CPU事件和從開始到結束的牆種時間、和實際消耗量多少時間。牆種時間和CPU時間的區別是:牆種時間包括各種非運算時間的等待耗時如Io阻塞,而CPU時間不包括這些時間。
GC常用命令
以下均以大小“10m”為例
-Xms10m:表示 Java 初始化堆的大小為10m
-Xmx10m:表示最大 Java 堆大小為10m
以上兩個引數合用會限制java堆大小為10m,並且不可拓展
-Xss10m:表示每個 Java 執行緒堆疊大小為10m
-Xmn10m:為新生代的大小為10m
JVM的GC日誌的主要引數包括如下幾個:
-XX:SurvivorRatio=8 :決定了新生代中Eden和一個survivor區空間的比例為8:1
-XX:+PrintGC 輸出GC日誌
-XX:+PrintGCDetails 輸出GC的詳細日誌
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2017-09-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的前後打印出堆的資訊
-Xloggc:../logs/gc.log 日誌檔案的輸出路徑
以下命令使用方法為 -XX:+命令