JVM理論:(二/4)理解GC日誌、垃圾收集器參數總結
JVM的GC日誌的主要參數包括如下幾個:
-XX:+PrintGC 輸出GC日誌
-XX:+PrintGCDetails 輸出GC的詳細日誌
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的前後打印出堆的信息
-XX:+PrintGCApplicationStoppedTime // 輸出GC造成應用暫停的時間
-Xloggc:../logs/gc.log 日誌文件的輸出路徑
GC日誌
每一種收集器的日誌格式都可以不同,但基本上都維持了一定的共性,以下兩段GC日誌為例:
33.125:[GC[DefNew:3324K->152K(3712K),0.0025925secs]3324K->152K(11904K),0.0031680 secs]
100.667:[FullGC[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發生的時間,這個數字的含義是從Java虛擬機啟動以來經過的秒數。
開頭的“[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”,老年代和永久代同理,名稱也是由收集器決定的。
可參考:http://www.cnblogs.com/mikevictor07/p/5024645.html?utm_source=tuicool&utm_medium=referral
後面方括號內部的“3324K->152K(3712K)”含義是“GC前該內存區域已使用容量->GC後該內存區域已使用容量(該內存區域總容量)”。 而在方括號之外的“3324K->152K(11904K)”表示“GC前Java堆已使用容量->GC後Java堆已使用容量(Java堆總容量)”。
再往後,“0.0025925 secs”表示該內存區域GC所占用的時間,單位是秒。
內存各區域分配日誌
Heap
def new generation total 9216K, used 4326K //年輕代
eden space 8192K, 51% used
from space 1024K, 14% used
to space 1024K, 0% used
tenured generation total 10240K, used 6144K //老年代
the space 10240K, 60% used
compacting perm gen total 12288K, used 2114K //永久代(方法區)
the space 12288K, 17% used
垃圾收集器參數總結
參考鏈接:
https://blog.csdn.net/column/details/14851.html
https://blog.csdn.net/baidu_33116785/article/details/53258822
JVM理論:(二/4)理解GC日誌、垃圾收集器參數總結