VisualVM 是什么
VisualVM 是一个图形化的 JVM 监控与分析工具,可以查看应用程序的 CPU、内存占用,监控线程状态,生成线程转储(Thread Dump)或堆转储(Heap Dump),跟踪内存泄漏,监控垃圾回收,并支持简单的 CPU/内存 profiling。它也能浏览和操作 MBean,配合 JMX 做远程监控。
VisualVM 曾在 JDK 6 Update 7 之后随 Sun/Oracle JDK 一起分发;从 JDK 9 起被移出 JDK 发行包,独立成开源项目 visualvm.github.io,需要单独下载安装,本身要求 JDK 8 及以上运行,但可以监控 JDK 1.4 以上版本的目标进程。
安装与启动
从 visualvm.github.io 下载对应平台的安装包,解压后运行 visualvm(Windows 下是 visualvm.exe)。
如果 VisualVM 找不到本机 JDK,用 -jdkhome 显式指定:
visualvm -jdkhome /path/to/jdk
插件默认安装在用户目录下,例如 Windows:
%APPDATA%\VisualVM\<version>
线程监控与 Thread Dump
启动 VisualVM 后,“应用程序 > 本地” 节点会列出本机正在运行的 Java 进程。双击目标进程,切换到「线程」标签页,可以看到各线程的实时状态跟踪。
点击「线程 Dump」按钮会生成当前时刻的线程转储文件,里面包含每个线程的调用栈、锁等待对象等信息,用来定位线程阻塞、死锁的位置;关于线程转储的字段含义与死锁排查方法,参考 jstack。
VisualVM 线程状态
| 状态 | 说明 |
|---|---|
| Running | 正在运行 / 可运行(runnable) |
| Sleeping | 线程调用了 Thread.sleep() |
| Wait | 线程处于 wait 或 timed_waiting |
| Park | 线程调用了 LockSupport.park() |
| Monitor | 线程被 monitor 锁阻塞(blocked) |
远程监控
VisualVM 也可以通过 JMX 或 jstatd 监控远程 JVM 进程,思路和本地类似,多了一步网络连接配置。
用 jstatd 暴露远程 JVM 统计信息
-
新建一个
jstatd.all.policy策略文件,避免jstatd启动时报权限异常:grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; }; -
检查默认端口(1099)是否被占用:
netstat -ano | grep -i 1099 -
端口被占用时指定其他端口启动:
rmiregistry 2020 & jstatd -J-Djava.security.policy=jstatd.all.policy -p 2020
用 JMX 远程连接
-
在目标 JVM 启动参数里开放 JMX 端口(生产环境务必开启鉴权与 TLS,以下为最简示例):
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=2899 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ -Djava.rmi.server.hostname=<host-ip>" -
检查端口是否已监听:
netstat -a | grep -i 2899 -
在 VisualVM 中「添加 JMX 连接」,填入目标地址和端口即可看到远程进程的监控数据。
JDK 26 时代还推荐用 VisualVM 吗
VisualVM 项目仍在维护,本地开发机上临时看看线程状态、堆占用、做一次快速的 heap/thread dump,依然好用,尤其是不想额外安装工具时的顺手选择。
但作为现代 JDK 诊断栈的主力工具,它已经不是首选:
- CPU 热点分析:更推荐 async-profiler,基于硬件/软件事件采样,不受安全点偏差影响,还能直接产出火焰图;VisualVM 内置的 CPU profiler 依赖字节码插桩,开销大、数据也不够准。
- GC、锁、内存分配、虚拟线程 pinning 等:官方标准做法是 Java Flight Recorder(JFR),持续录制、开销低,再用 JDK Mission Control(JMC)离线分析,而不是 VisualVM 的实时图表。
- 命令行诊断入口:Oracle 现在统一推荐 jcmd 而不是
jstack/jmap等独立小工具。
更完整的现代诊断工具选型对比见 Java 生产环境诊断工具选型。
结论:VisualVM 可以留着应急,但生产环境的常态化监控和性能分析,JDK 26 下更推荐 JFR + JMC + async-profiler 这套组合。
参考
维护记录
| 时间 | 修改内容 | 原因 |
|---|---|---|
| 2026-07-16 | 文件重命名为 visualvm.md;标题、url、分类改为 language;标签由 reprint 改为 remix + AI-assisted;全文重新整理为分节结构;删除 YourKit 段落;补充「JDK 26 时代还推荐用 VisualVM 吗」一节并内链 JFR、jcmd、生产诊断工具选型文章 |
原文中文文件名不合规,内容是 WordPress 导入的碎片化段落,且未反映 VisualVM 自 JDK 9 起移出 JDK 发行包的现状 |