jvm启动时增加以下参数,可以输出日志到指定目录中:
-XX:+PrintGCDetails -Xloggc:F:\gc1.log
1.578: [GC (Allocation Failure) [PSYoungGen: 98304K->8374K(114688K)] 98304K->8454K(245760K), 0.0090852 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
1.925: [GC (Allocation Failure) [PSYoungGen: 106678K->12068K(114688K)] 106758K->12156K(245760K), 0.0089248 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
1.973: [GC (Metadata GC Threshold) [PSYoungGen: 20423K->7497K(114688K)] 20511K->7593K(245760K), 0.0056872 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
1.978: [Full GC (Metadata GC Threshold) [PSYoungGen: 7497K->0K(114688K)] [ParOldGen: 96K->7462K(131072K)] 7593K->7462K(245760K), [Metaspace: 20767K->20767K(1069056K)], 0.0377837 secs] [Times: user=0.09 sys=0.00, real=0.04 secs]
2.403: [GC (Allocation Failure) [PSYoungGen: 98304K->7905K(114688K)] 105766K->15375K(245760K), 0.0048318 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
2.813: [GC (Allocation Failure) [PSYoungGen: 106209K->12724K(114688K)] 113679K->20202K(245760K), 0.0070188 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
解读:
GC日志分析:
1、最前面的数字 “1.578” 代表从JVM启动到发生GC的时间
2、GC日志开头的“[GC 和 [Full GC” 说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是年老代GC的。Allocation Failure(空间不足)和Metadata GC Threshold(元空间不足)说明发生GC的原因
3、PSYoungGen, ParOldGen,PSPermGen表示GC发生的区域,这里显示的区域名称与使用的GC收集器密切相关,不同收集器对于不同区域所显示的名称可能不同。
4、98304K->8374K(114688K) 含义:
GC前该内存区域已使用容量 -> GC后该内存区域已使用容量(该内存区域总容量)
98304K->8454K(245760K) 含义:
GC前java堆已使用容量 -> GC后java堆已使用容量(Java堆总容量)
5、0.0090852 secs 表示该内存区域GC所占用的时间,单位是秒。
6、[Times: user=0.00 sys=0.00, real=0.00 secs]
用户消耗的CPU时间,内存态消耗的CPU时间,和操作从开始到结束所经过的墙钟时间。