Java可视化故障处理工具-VisualVM
VisualVM( All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。 Oracle曾在VisualVM的软件说明中写上了“All-in-One”的字样,预示着它除了常规的运行监视、故障处理外,还将提供其他方面的能力,譬如性能分析(Profiling)。VisualVM的性能分析功能比起JProfiler、 YourKit等专业且收费的Profiling工具都不遑多让。 而且相比这些第三方工具, VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent去运行,因此它的通用性很强,对应用程序实际性能的影响也较小, 使得它可以直接应用在生产环境中。这个优点是JProfiler、 YourKit等工具无法与之媲美。
官方文档:(VisualVM在jdk8之后分离出来单独发展。)
2、VisualVM
一、VisualVM两个连接方式
方式一:JMX方式
第一步:远程java应用需要加上如下启动参数
# 远程服务器ip,即本机ip,不建议用 localhost、127.0.0.1
-Djava.rmi.server.hostname=XXX.XXX.XXX.XXX
# 允许 JMX 远程调用(jdk6以下要加,以上默认开启)
-Dcom.sun.management.jmxremote
# 自定义 JMX 端口号和RMI端口
-Dcom.sun.management.jmxremote.port=8899
-Dcom.sun.management.jmxremote.rmi.port=8899(可以不加)
# 是否需要 ssl 安全连接方式
-Dcom.sun.management.jmxremote.ssl=false
# 是否需要密钥
-Dcom.sun.managent.jmxremote.authenticate=false
第二步:配置jmxremote权限和密码 -Dcom.sun.managent.jmxremote.authenticate设置false也不行 也要输入用户、口令才能连接成功。
进入${jre.home}/lib/management目录:
# 根据密码文件模板拷贝一份
cp -r jmxremote.password.template jmxremote.password
#编辑jmxremote.password去掉monitorRole QED 和 controlRole R&D 前面的#注释 ,也可以自行定义账号和密码
#修改权限
chmod 0400 jmxremote.password
# jmxremote.access文件里用来设置账号对应的jmx操作权限,里面默认设置了两个monitorRole 和 controlRole 权限,如果自定义账号,这里也必须进行权限设置,设置哪些权限参考controlRole的设置。
方式二:jstatd连接.
#进入${JAVA_HOME}/bin创建新文件 jstatd.all.policy,编辑该文件,填入内容
grant codebase"file:${java.home}/../lib/tools.jar"{
permission java.security.AllPermission;
};
# 给该文件加上执行权限
chmod +x jstatd.all.policy
#启动命令(在$JAVA_HOME/bin目录下执行) 命令中默认监听1099端口,可通过-p指定端口,hostname使用服务器的公网ip,若只在局域网内使用可使用本地ip。
nohup ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.2.211 -p 12345 &
两种方式都要配置,因为有些插件仅支持一种方式。比如MBeans需要JMX连接方式、VisualGC仅支持JStatd连接方式。
二、VisualVM四个基本选项卡
1、选项卡--概述
java应用信息,jvm参数设置、sysproperty参数设置。
2、选项卡--监视
监视cpu、线程、类加载、堆和永久代动态变化。可以手工执行GC垃圾回收、堆转储操作。
3、选项卡--线程
监视所有线程活动状态,可以执行线程转储操作。
4、选项卡--抽样器,用于性能分析。
通过堆程序运行时cpu耗时、内存分配抽样并快照数据,用于性能分析。
三、VisualVM 堆快照分析
VisualVM支持载入堆快照然后进行分析。可以于MAT互补。
四、VisualVM强大在于接入各种功能强大的插件
1、插件更新地址设置
地址:https://visualvm.github.io/pluginscenters.html 选择版本对应的地址进行设置
2、线程相关插件
2.1、Threads Inspector插件
线程选项卡下一个功能,可以查看线程堆栈信息。
2.2、TDA(Thread Dump Analyzer)插件
用于分析线程转储。
使用参考:TDA
3、堆内存相关插件
3.1 VisualGC插件
使用参考:VisualGC
3.2 GC日志分析 GCViewer
GCViewer不是VisualVM插件,由于相关 放在这里一起介绍。
参考:GCViewer
4、源代码跳转
(1)源代码目录设置举例:下面这种方式可以选中多个模块下代码,配置的原则就是 VisualVM里的代码一般都是com.xxxx或者org.xxx开头 那么选择路径就要到com或org上一层 ,也可以直接选择jar包。
(2)设置源代码查看器
使用notepad++:
例:D:\notepadd++\notepad++.exe {file} 后面只需要跟文件名
使用Idea:
例:D:\JetBrains\IntelliJIDEA2019.3.5\bin\idea64.exe {file}:{line} 后面跟文件名和行号
使用参考:Source Support
5、启动性能分析插件-Startup Profiler
6、动态跟踪插件-BTrace.
其他插件:
Tracer:使用各种探针从应用程序收集指标,并在时间轴中显示数据。数据以图形和表格形式显示,并可导出为通用格式,供外部工具进一步处理。
Buffer Monitor:监控ByteBuffer.allocateDirect创建的直接缓冲区和FileChannel.map创建的映射缓冲区的使用情况
OQL Syntax Support:堆转储分析里面的OQL增强编辑器。参考:OQL
JConsole Plugins Container:支持JConsole扩展。 参考:JConsole
MBeans Browser:JConsole里各种管理Bean。 参考:JConsole