一、日志打印
1.JVM中增加参数
‐Xloggc:./gc‐%t.log ‐XX:+PrintGCDetails ‐XX:+PrintGCDateStamps ‐XX:+PrintGCTimeStamps ‐XX:+PrintGCCause ‐XX:+UseGCLogFileRotation ‐XX:NumberOfGCLogFiles=10 ‐XX:GCLogFileSize=100M
2.Tomcat 加在JAVA_OPTS变量里
二、GC日志分析Demo
本地起一个服务,参数如下:
java -jar -Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M .\microservice-eureka-server.jar
项目启动,打开日志文件,内容如下:
项目的配置参数
这里不仅配置了打印GC日志,还有相关的VM内存参数。
GC情况分析
2022-06-04T14:42:00.589+0800: 2.829: [Full GC (Metadata GC Threshold) [PSYoungGen: 4997K->0K(129024K)] [ParOldGen: 2890K->7520K(94720K)] 7887K->7520K(223744K), [Metaspace: 20864K->20864K(1069056K)], 0.0381591 secs][Times: user=0.16 sys=0.00, real=0.04 secs]
1、2.829 :从jvm启动开始计算到这次GC经过的时间
2、Full GC(Metadata GC Threshold):指这是一次full gc,括号里是gc的原因, PSYoungGen是年轻代的GC, ParOldGen是老年代的GC,Metaspace是元空间的GC。
3、[PSYoungGen: 4997K->0K(129024K)] :三个数字分别对应GC之前占用年轻代的大小,GC之后年轻代占用,以及整个年轻代的大 小。
4、[ParOldGen: 2890K->7520K(94720K)] :三个数字分别对应GC之前占用老年代的大小,GC之后老年代占用,以及整个老年代的大小。
5、7887K->7520K(223744K):三个数字分别对应GC之前占用堆内存的大小,GC之后堆内存占用,以及整个堆内存 的大小。
6、[Metaspace: 20864K->20864K(1069056K)]:三个数字分别对应GC之前占用元空间内存的大小,GC之后元空间内存占用,以 及整个元空间内存的大小。
7、0.0381591 secs:该时间点GC总耗费时间
优化
从日志可以发现fullgc都是由于元空间不够导致的,所以我们可以将元空间调大点。
java -jar -Xloggc:./gc‐adjust-%t.log ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M -XX:+PrintGCDetails -XX:+PrintGCDateStamps ‐XX:+PrintGCTimeStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M .\microservice-eureka-server.jar
调整完我们再看下gc日志发现已经没有因为元空间不够导致的fullgc了
三、gceasy可视化GC日志
上传gc文件利用可视化的界面来展现GC情况
官网地址:https://gceasy.io/
将上面生成的GC日志文件导入分析
1、可以看到年轻代、老年代、以及永久代的内存分配和最大使用情况。
2、可以看到堆内存在GC之前和之后变化以及其他信息
四、JVM参数汇总查看命令
打印出所有参数选项的默认值
java -XX:+PrintFlagsInitial
打印出所有参数选项在运行程序时生效的值
java -XX:+PrintFlagsFinal
文章仅供学习交流,侵权联系删除。