VisualVM是JDK自带的免费的,集成了多个JDK命令行工具的可视化工具,为Java应用程序做性能分析及调优
VisualVM通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。

性能分析的主要方式

监视

转储

系统转储

Java转储

堆转储

快照

CPU快照

内存快照

性能分析

CPU性能分析

内存性能分析

线程性能分析

VisualVM 安装

JDK 6 Update7以后, VisualVM已作为OracleJDK的一部分。

而官网也可以下载安装。但它本身需要JDK6以上版本运行,可以监控JDK1.4以上版本的应用程序。

官网地址:
​​​http://visualvm.java.net/​

安装插件

通过菜单里的插件管理器,或到插件中心手工下载、离线安装。
插件中心网址:
​​​http://visualvm.java.net/pluginscenters.html​

功能

内存分析

堆内存分析图示例
JAVA性能分析——VisualVM_性能

永久保留区域使用情况
JAVA性能分析——VisualVM_可视化工具_02

在Applications程序上,点击右键“当出现OOME 时生成堆Dump”功能,当程序出现OutOfMemory例外时,VisualVM将自动生成一个堆转储。

内存评估示例
JAVA性能分析——VisualVM_性能_03

CPU使用情况
JAVA性能分析——VisualVM_java_04

线程分析
VisualVM提供了三种视图的线程分析,默认以时间线的方式展现。
JAVA性能分析——VisualVM_jdk_05

快照功能
- 应用程序快照
- Profiler快照

* 转储功能*
- 线程转储
JAVA性能分析——VisualVM_可视化工具_06
- 堆转储
JAVA性能分析——VisualVM_可视化工具_07
JAVA性能分析——VisualVM_性能_08
两个堆转储文件可以进行比较。

运行jar启用rmx

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=7777 -jar myjar.jar

在Java VisualVM 添加远程RMX主机,添加远程主机IP:7777即可。

其它问题

另外,需要远程监控时,要浏览host里hostname绑定的网卡。
可以使用

hostname -i

查看对应的IP地址。运行Java VisualVM的主机要能够访问到该 IP。
如果显示的是私网IP,外网无法访问,则可以修改host文件,或设置端口转发。

防火墙问题
除了JMX server指定的监听端口号外,JMXserver还会监听一到两个随机端口号,
可以通过命令:

lsof -i|grep java |grep <pid>

来查看当前java进程需要监听的随机端口号,要把这些随机端口也在防火墙放行。

如果监控Tomcat,可以使用附加组件。