🏆「作者推荐」【JVM 性能分析】精心准备了一套 JVM 分析工具的锦囊(中部)

系列文章分布
jps 进程监控工具的使用
jstat 性能监控工具的使用
jinfo 参数配置监控工具的使用
jmap 内存监控工具的使用
jstack 线程监控工具的使用
jhat 图形化分析工具的使用
JVM 离线分析工具(VisualVM),用于分析 dump 下来的堆内存文件,远程监控 JVM 状态。
第三方在线监控工具(Arthas 的使用)
堆转储快照分析工具
jvisualvm 也是 JDK 自带的命令,虽然后面独立发展了。这两种方式都可以使用。
VisualVM 链接:https://visualvm.github.io/
使用 VisualVM 分析上面 jmap 导出的堆栈转储文件,导入后如下:
离线分析工具(VisualVM)
VisualVM 安装
VisualVM 不需要额外安装,我们安装 JDK 的时候就自带了 VisualVM,在安装 JDK 的 bin 目录下可以找到 jvisualvm.exe

VisualVM 插件安装
点击工具->插件,在窗口栏里选择自己需要的插件进行在线安装。

使用 VisualVM 分析 dump 文件
因为我们通常都是没办法直接在生产环境进行调优分析的,所以一般都会把相关的内存、线程的 dump 文件拿到自己的电脑进行分析,VisualVM 支持导入 dump 文件的方式。
在需要进行内存分析的机器上把 内存或线程日志 dump 下来
用 VisualVM 打开 dump 文件
点击 文件->装入 选择你需要分析的 dump 文件后会出现下图分析界面。

概要信息 (相当于 Jinfo 指令获取的信息)
这里面主要可以了解 JVM 环境配置、JDK 版本,应用基本信息。
包括基本信息(dump 文件的基本信息)、环境(jdk 基本信息)、系统属性(应用参数信息)。

类信息(相当于 Jmap 指令获取的信息)
在这个栏目里面主要关注的是对应类型的对象 在内存中的实例对象实例树 、总占用空间大小分别是多少,如果是因为产生大对象、或者突然产生大批量的对象则可以通过这里定位到问题。

VisualVM 本地监控
本地监控很简单,打开 VisualVM 就可以从左侧栏目里看到本机的应用,点击对应的应用就可以看到对应的内存、线程、GC 信息。

VisualVM 远程监控
VisualVM 不仅能监控本地的应用程序,还可以监控远程服务器上的应用,虽然远程监控一般不会用于生产环境的,但是在测试环境做一些压力测试做一些性能的预调优,这个时候使用 VisualVM 来远程监控测试服务器的 JVM 使用情况,这样有助于我们了解到 JVM 的实时运行状态而进行优化和调整。
第一步:应用配置 jmx 支持
需要使用 VisualVM 监控某个远程服务器的 JVM 应用,那么首先要对需要配置远程监控应用对 MX 的支持。
配置方式:jar 包启动直接 java -jar 后面跟参数;tomcat 启动则需编辑 tomcat 的 catalina.sh 配置文件增加 JAVA_OPTS 配置。
jar 包启动配置案例
需要注意的参数:
Dcom.sun.management.jmxremote.port //指定 jms 通讯端口,这个随意只要不与其他应用冲突即可。
Djava.rmi.server.hostname //连接 IP,填写当前服务器的外网 IP。
Dcom.sun.management.jmxremote.ssl //是否位加密连接。
Dcom.sun.management.jmxremote.authenticate//是否进行权限连接认证,flase 不需要,ture 的话就需要指定用户名,密码配置。
management.jmxremote.access.file // 用户名 和对应用户的权限配置
Dcom.sun.management.jmxremote.password.file //用户名对应的密码
创建用户名密码
如果 Dcom.sun.management.jmxremote.authenticate 配置为 true 则需要进行此步骤。
编辑 jmx.access 文件添加用户名 并指定权限
命令
vim jmx.access
添加内容
admin readwrite
jmx.password 文件里指定用户名和对应密码:
命令
vim jmx.access
添加内容
admin 123456
修改 password,access 文件访问权限
第二步:建立内网公网 IP 映射
如果是云服务器则需要建立局域网与公网 IP 映射

第三步:开放端口访问限制
防火墙:Dcom.sun.management.jmxremote.port 对应端口
云服务器安全组策略 开放 Dcom.sun.management.jmxremote.port 对应的端口
第四步:VisualVM 进行远程连接
添加远程服务器

建立 JMX 连接

连接成功

版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/d641aa93c29a4c40374282643】。文章转载请联系作者。
评论