调优-基于JVisualVM的可视化监控
2、基于JVisualVM的可视化监控
2.1 监控本地java进程
JDK的bin路径下 C:\Program Files\Java\jdk1.8.0_60\bin\jvisualvm.exe
多语言文档 http://visualvm.github.io/documentation.html
可以直接查看本机的java进程、远程java进程、也可以直接导入.hprof文件(类似MAT内存分析工具)
可以在"概要"面板中看到OutOfMemoryError、死锁、死循环等报告
可以在"抽样器"面板中对cpu和内存进行抽样,这样就可以看到哪些方法占用的时间较长。
还可以选择某个方法进行"线程Dump",从而可以分析一下异常信息
安装JVisualVM插件
https://visualvm.github.io/pluginscenters.html
选择对应JDK版本区间的配置地址,(执行java -version),点击工具 > 工具 > 插件 >
新增地址 > 在切换到可用插件并选择Visual GC和BTrace Workbench > 重启JVisualVM
2.2 监控远程的java进程
修改 catalina.sh
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9004
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.net.preferlPv4Stack=true
-Djava.rmi.server.hostname=192.168.50.91"
#特别注意,不同网段的ip直接虚拟主机可能连不上
修改 /usr/mylibs/tomcat7/apache-tomcat-7.0.73/bin/catalina.sh
搜索/JAVA_OPTS,按N下一个,找到JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS",在这前面粘贴上面的配置,并重启tomcat
由于linux上总是出现一些连接问题,暂时在window上测试。
特别注意:window上应该是使用.bat的配置和启动,实测连接失败。
然后修改catalina.sh,并启动startup.sh(自动使用Git Bash工具启动)
在JVisualVM > 远程 > 添加远程主机 > 右击添加JMX连接 > 端口号9004 连接成功
(window下重启tomcat,最好先杀掉java进程)
tomcat启动测试 http://192.168.50.91:8080/examples/
相关的连接应该出现在远程的节点下,但是实测出现在本地节点中
2.3 监控远程普通的java进程
注意这时的端口改成9005
添加启动参数
hohup java -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9005
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.net.preferlPv4Stack=true
-Djava.rmi.server.hostname=192.168.50.91 -jar java-optimization-and-debug-for-prod-env-0.0.1-SNAPSHOT.jar &
以上在linux中可能无法访问
window下(不支持换行,所以在文本编辑中去掉换行符)
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9005 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferlPv4Stack=true -Djava.rmi.server.hostname=192.168.50.91 -jar java-optimization-and-debug-for-prod-env-0.0.1-SNAPSHOT.jar
右击添加JMX连接 > 端口号9005 连接成功
相关的连接应该出现在远程的节点下,但是实测出现在本地节点中
window下访问测试 http://192.168.50.91:12345/heap 内存溢出
启动多个请求,内存占用到99%后,JVisualVM自动退出了。
应该可以在"监视”面板中查看堆的信息,并点击"堆dump”后,然后分析对象
再次测试死锁问题 访问 http://192.168.50.91:12345/deadlock
一段时间后在"线程"版本中提示检测到死锁,并"线程dump"