1. GC日志参数
- -verbose:gc 输出gc日志信息,默认输出到标准输出
- -XX:+PrintGC 等同于-verbose:gc 表示打开简化的GC日志
- -XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况
- -XX:+PrintGCTimeStamps 输出GC发生时的时间戳,时间是从程序执行到现在的时间
- -XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息
- -Xloggc: 把GC日志写入到一个文件中去,而不是打印到标准输出中
- -XX:+PrintGCDateStamps 输出GC的日期时间戳
2. GC日志格式
1. GC分类
- MinorGC
- MajorGC
- FullGC
2. GC日志分类
- MinorGC
- FullGC
3. GC日志剖析
垃圾收集器
- Serial (Default New Generation) “[DefNew”
- ParNew (Parallel New Generation) “[ParNew”
- Parallel Scavenge “[PSYoungGen”
- Parallel Old Generation “[ParOldGen”
- G1 “[garbage-first heap”
GC前后情况
- 新生代
- 回收前大小
- 回收后大小
- 总大小
- 堆空间
- 回收前大小
- 回收后大小
- 总大小
GC时间
- user 用户代码执行时间
- sys 内核态消耗时间
- real 程序从开始到结束时间
4. MinorGC日志分析
完整日志
2021-02-24T14:16:13.583+0800: 0.386: [GC (Allocation Failure) [PSYoungGen: 2048K->496K(2560K)] 2048K->872K(9728K), 0.0120934 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
gc执行时间
2021-02-24T14:16:13.583+0800:
gc发生时,jvm虚拟机启动以来经过的秒数
0.386:
GC执行原因,Eden区分配失败
[GC (Allocation Failure)
垃圾回收器,年轻代空间大小
[PSYoungGen: 2048K->496K(2560K)]
- PSYoungGen: 表示gc发生的区域,区域名称与使用的GC收集器密切相关
- Serial收集器:Default New Generation 显示DefNew
- ParNew收集器:ParNew
- Parallel Scanvenge收集器:PsYoung
- 老年代和新生代同理
- 2048K->496K(2560K)gc前该内存区域已使用容量 -> GC后该区域容量(该区域总容量)
- 如果是新生代,总容量则会显示整个新生代的9/10,即eden + from/to区
- 如果是老年代,总容量是全部内存大小,无变化
整堆空间大小
2048K->872K(9728K)
在显示完区域容量GC的情况之后,会接着显示整个内存区域的GC情况:GC前堆内存已使用容量->GC后堆内存容量(堆内存总容量),堆内存总容量 = 9/10新生代 + 老年代《初始化的内存大小(Eden:from:to = 6:1:1自动优化)
整个GC花费的时间,单位秒
0.0120934 secs
整个GC花费的时间,单位秒
时间统计
[Times: user=0.00 sys=0.00, real=0.01 secs]
- user cpu在用户态的花费时间,这次gc中,执行用户代码的时间,每个cpu单独算
- sys cpu在内核态的时间,cpu的调度时间 user+sys
- real gc花费的总时间
5. MajorGC日志分析
完整日志
2021-02-24T15:02:43.537+0800: 54.324: [Full GC (Allocation Failure) [PSYoungGen: 15486K->15486K(17920K)] [ParOldGen: 40436K->40436K(40960K)] 55923K->55923K(58880K), [Metaspace: 3470K->3470K(1056768K)], 0.0042270 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
GC原因
[Full GC (Allocation Failure)
发生了一次Full GC
- Full GC (Allocation Failure)空间分配失败
- Full GC(Ergonomics) JVM自适应调整导致的GC
- Full GC(sytem) System.gc()导致的GC
老年代空间大小
[ParOldGen: 40436K->40436K(40960K)]
老年代没有回收垃圾
元空间大小
[Metaspace: 3470K->3470K(1056768K)]
元空间没有发生GC因为是Eden分配失败