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之后分离出来单独发展。)

1、java8 visualVM

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

posted @ 2023-12-06 23:38  cac2020  阅读(135)  评论(0编辑  收藏  举报