JVM调优-问题排查与工具使用案例一(Server服务器)
指导原则
多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题。在实际使用中,分析GC情况优化代码比优化GC参数要多得多,GC优化往往是最后的手段。
指标参考
a.Minor GC执行时间不到50ms;
b.Minor GC执行不频繁,约10秒一次;
c.Full GC执行时间不到1s;
d.Full GC执行频率不算频繁,不低于10分钟1次;
业务案例
某个业务系统在正常运行一段时间后开始变慢,重启后恢复正常,于是踏上代码排查与JVM调优之路。根据服务器的实际配置,当前业务系统主要考虑低延迟和增大吞吐量。(选择调优方向请参考:https://blog.****.net/Simon111Qiu/article/details/109409528)
jvisualvm.exe工具
1、连接JVM对应的进程
通过jvisualvm.exe工具进行本地或远程JVM的监控。在JDK安装的bin文件下可以找到jvisualvm.exe工具并打开,通过在连接中创建本地JVM或远程JVM进程的连接(Java进程),如下图:
PS:对于Windows系统上通过服务启动的Tomcat,则需要在启动配置中添加如下配置方可进行本地或远程通过JMX连接,如下图所示:
从上到下依次是:开放JMX连接的端口;是否使用安全连接;是否设置权限认证(设置口令)
-Dcom.sun.management.jmxremote.port=12321
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
2、获取对象数据
在连接信息上右键选择进行堆内存的备份(dump),如下图所示:
选择占用内存较多的类对象进行代码分析,通过优化代码的方式减少对象的创建和JVM的GC操作。如下图所示:
Jconsole.exe工具
1、连接JVM对应的进程(多个Tomcat容器使用同一个JDK会创建不同的JVM进程)
因为使用的是windows server服务器,本次问题排查使用的是JDK自带的Jconsole工具,通过Jconsole.exe工具进行本地或远程JVM的监控。在JDK安装的bin文件下可以找到Jconsole.exe工具并打开,通过在连接中创建本地JVM或远程JVM进程的连接(Java进程),如下图:
PS:对于Windows系统上通过服务启动的Tomcat,参照jvisualvm的操作。
2、概要
通过概要了解堆内存使用情况、线程活动情况、CPU占用率等重要参数。当设置的JVM内存不满足堆内存等的使用时则会造成内存溢出。
3、内存参数
了解堆内存GC的情况,如年轻代GC的次数和总的耗费时间,老年代总的GC次数和总的耗费时间。从而可以得到年轻代和老年代GC的频次和平均持续时间。如下:
①年轻代当前总的GC次数:34次;(一般次数多的是年轻代的垃圾收集器)
②年轻代平均GC持续时间:0.164s/34*1000≈4.9ms;(会造成应用停止)(OK)
③老年代当前总的GC次数:3次;
④老年代平均GC持续时间:0,207s/3*1000≈69ms;(OK)
⑤年轻代GC频次:3min*60/34次≈5.3s一次;(有点快)
⑥老年代GC频次:3min*60/3次≈60s一次;(有点快)
通过以上参数可以得出,需要选择合适的垃圾回收器并分配合适的堆内存大小。
参考:https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html;垃圾回收器设置参考《Behavioral Options》部分,堆内存等大小设置参考《Performance Options》部分或者其他设置方式。
PS:同时可以通过手动GC的方式在系统负载最高的时候或性能较差的时候观察GC的持续时间(最坏的GC时间),通过这个时间来作为JVM内存优化的一个参考。
其他界面参数有兴趣可以继续进行研究。
最后,往上有很多调整参数的方式,暂时不进行研究了,找了如下参考: