垃圾回收的时候可以输出垃圾回收的详细信息,帮助我们分析垃圾回收的具体内容,了解一下gc日志的相关内容
1. 输出GC日志的相关参数
1.1 输出GC过程日志
-XX:+PringGC
输出格式
[GC (Allocation Failure) 2073K->784K(98304K), 0.0006580 secs]
GC: gc的类型 GC表示新生代gc FullGC表示新生代/老年代/方法去
Allocation Failure: 出现gc操作的原因,比如这个原因就是分配失败,就是分配内存的时候空间不足,就触发了GC
2073K->784K(98304K) 第一个是当前的内存,> 后的是回收后的内存大小 ()里的是需要的内存大小,即为了存放对象需要多少内存.
可以看到我们为了存放98304K大小的对象,进行了好几次GC,都没办法满足(我设置了最大堆内存),最终就会出现Java heap space
1.2 输出GC详细信息,包含堆内存空间信息
-XX:+PrintGCDetails
可以看到比上面的gc日志又增加了堆内存的详细信息
其中垃圾回收日志也增加了部分输出
[GC (Allocation Failure) [PSYoungGen: 2073K->744K(29696K)] 2073K->752K(98304K), 0.0005600 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
PSYoungGen: 代表着新生代回收 PS是垃圾回收器 Parallel Scavenge的缩写
Heap
PSYoungGen total 29696K, used 1280K [0x00000000fdf00000, 0x0000000100000000, 0x0000000100000000)
eden space 25600K, 5% used [0x00000000fdf00000,0x00000000fe0401a8,0x00000000ff800000)
from space 4096K, 0% used [0x00000000ff800000,0x00000000ff800000,0x00000000ffc00000)
to space 4096K, 0% used [0x00000000ffc00000,0x00000000ffc00000,0x0000000100000000)
ParOldGen total 68608K, used 567K [0x00000000f9c00000, 0x00000000fdf00000, 0x00000000fdf00000)
object space 68608K, 0% used [0x00000000f9c00000,0x00000000f9c8dda8,0x00000000fdf00000)
Metaspace used 3165K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 345K, capacity 388K, committed 512K, reserved 1048576K
这个堆内存的信息主要就是展示新生代/老年代/永久代(jdk1.8元空间)的总大小/使用率的情况
1.3 输出GC的耗时和时间信息
# 打印GC耗时
-XX:+PrintGCTimeStamps
# 打印GC发生的时间
-XX:+PrintGCDateStamps
这两个参数要配合上面的输出GC日志使用,单独使用没有效果,很好理解,没有输出gc日志,怎么打印gc的耗时?
例子:
输出:
可以看到增加了gc发生的时间和gc的耗时.
1.4 在GC前后打印堆的信息
-XX:+PrintHeapAtGC
可以看到有具体的详细信息:
2. 图示说明gc日志信息
2.2 YoungGC
2.3 FullGC
3. 工具分析GC日志
首先需要存储gc日志,参数如下:
-Xloggc:[路径]
#例:
-Xloggc:./gclogs/gc.log
使用的工具有多种:
GCViewer,GCEasy,GCHisto,GCLogViewer,Hpjmeter,garbagecat等.
3.1 GCViewer
GCViewer下载地址: https://github.com/chewiebug/GCViewer/releases
GCViewer下载后的jar包,直接点击运行接口
导入gc日志文件后可以看到:
3.2 GCEasy
GCEasy在线地址: https://gceasy.io/
选择文件
可以看到具体的信息
3.3 总结
工具的作用是帮助我们分析日志,要知道在生产环境很长时间才会出现一次FullGC,认为排查比较困难,这个时候就需要依赖工具了.