環境: JDK1.8
打開GC日志:
-verbose:gc
這個只會顯示總的GC堆的變化, 如下:
[GC (Allocation Failure) 80832K->19298K(227840K), 0.0084018 secs]
[GC (Metadata GC Threshold) 109499K->21465K(228352K), 0.0184066 secs]
[Full GC (Metadata GC Threshold) 21465K->16716K(201728K), 0.0619261 secs]
參數解析:
GC, Full GC, GC的類型, GC只在新生代上進行, Full GC包括永生代, 新生代, 老年代。
Allocation Failure: GC發生的原因。
80832K->19298K: 堆在GC前的大小和GC后的大小。
228840k: 現在的堆大小。
0.0084018 secs: GC持續的時間。
但是如果想查看更詳細的信息, 比如新生代在GC前后的變化或者老年代在GC前后的變化等, 就需要打開另一個開關:
-XX:+PrintGCDetails
現在的命令就變成了 -verbose:gc -XX:+PrintGCDetails
, 然后輸出的信息如下:
[GC (Allocation Failure) [PSYoungGen: 70640K->10116K(141312K)] 80541K->20017K(227328K), 0.0172573 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[GC (Metadata GC Threshold) [PSYoungGen: 98859K->8154K(142336K)] 108760K->21261K(228352K), 0.0151573 secs] [Times: user=0.00 sys=0.01, real=0.02 secs]
[Full GC (Metadata GC Threshold) [PSYoungGen: 8154K->0K(142336K)] [ParOldGen: 13107K->16809K(62464K)] 21261K->16809K(204800K), [Metaspace: 20599K->20599K(1067008K)], 0.0639732 secs] [Times: user=0.14 sys=0.00, real=0.06 secs]
參數解析:
GC, Full FC: 同樣是GC的類型
Allocation Failure: GC原因
PSYoungGen: 使用了Parallel Scavenge並行垃圾收集器的新生代GC前后大小的變化
ParOldGen: 使用了Parallel Old並行垃圾收集器的老年代GC前后大小的變化
Metaspace: 元數據區GC前后大小的變化, JDK1.8中引入了元數據區以替代永生代, 因為永生代大小固定不能動態調整, 所以有弊端。
xxx secs: 指GC花費的時間
Times: user指的是垃圾收集器花費的所有CPU時間, sys, 花費在等待系統調用或系統事件的時間, real: GC從開始到結束的時間, 包括其他進程占用時間片的時間。
加上GC時間:
-XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
那么命令就變成了:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
輸出就變成了:
2019-09-24T22:15:24.518+0800: 3.287: [GC (Allocation Failure) [PSYoungGen: 136162K->5113K(136192K)] 141425K->17632K(222208K), 0.0248249 secs] [Times: user=0.05 sys=0.00, real=0.03 secs]
2019-09-24T22:15:25.559+0800: 4.329: [GC (Metadata GC Threshold) [PSYoungGen: 97578K->10068K(274944K)] 110096K->22658K(360960K), 0.0094071 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
2019-09-24T22:15:25.569+0800: 4.338: [Full GC (Metadata GC Threshold) [PSYoungGen: 10068K->0K(274944K)] [ParOldGen: 12590K->13564K(56320K)] 22658K->13564K(331264K), [Metaspace: 20590K->20590K(1067008K)], 0.0494875 secs] [Times: user=0.17 sys=0.02, real=0.05 secs]
可見帶上了時間和日期。
如果想把GC日志存到文件的話, 是下面這個參數:
-Xloggc:/path/to/gc.log
然后就可以用一些工具去分析這些gc日志。