
VisualVM 启动就报 Unsupported Java version
VisualVM 本身是 Java 应用,但不同版本只支持特定范围的 JDK。比如 VisualVM 2.1.7 只支持 JDK 8–17,而你用的是 JDK 21,它直接拒绝启动,连界面都不出来。
- 查清你本地
java -version输出的 JDK 版本,再去 官网下载页 对照「Supported JDK versions」列 - 不要混用:JDK 21 环境下别硬塞 VisualVM 2.1.7;改用 VisualVM 2.2+(目前最新是 2.2.1),它才正式支持 JDK 21
- 启动时显式指定 JDK 路径,避免被系统 PATH 里旧 JDK 干扰:
./visualvm --jdkhome /path/to/jdk-21
- Mac 用户注意:如果从 .dmg 安装,
visualvm可执行文件可能被封装在 app bundle 内部,得进VisualVM.app/Contents/MacOS/visualvm才能加--jdkhome
连接远程 JVM 时看不到进程或提示 Connection refused
VisualVM 默认只能连本地 JVM 进程。想连远程服务(比如测试服务器上的 Spring Boot 应用),光有网络通是不够的,JVM 启动参数必须开远程监控端口并放开 JMX 权限。
- 远程 JVM 启动时至少加这三项:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false
- 生产环境禁用
authenticate=false,但开发/测试阶段不加它,VisualVM 根本连不上——这是最常漏的点 - Linux 服务器记得关防火墙或放行端口:
sudo ufw allow 9999或检查iptables规则 - 如果应用跑在 Docker 里,除了容器内开端口,还要用
-p 9999:9999映射,并确保 JVM 参数里的jmxremote.host设为0.0.0.0(默认是localhost,会绑定到容器 loopback)
堆内存图表不动、GC 日志不更新、线程数始终为 0
不是 VisualVM 坏了,是目标 JVM 没开对应监控能力。Java 8u72 之后默认关闭了 com.sun.management.HotSpotDiagnostic MBean,而 VisualVM 的内存/线程/GC 面板全靠它驱动。
- 启动 JVM 时补上这个参数:
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput
- Java 9+ 用户注意:
HotSpotDiagnostic已迁移到模块系统,需额外加:--add-exports java.base/jdk.internal.vm=ALL-UNNAMED
- Spring Boot 应用如果用
spring-boot-maven-plugin打成 fat jar,JVM 参数要写在java -jar命令里,而不是pom.xml的exec.args(后者只影响构建过程) - 确认是否用了 GraalVM 或其他非 HotSpot JVM:VisualVM 对 OpenJ9、GraalVM 的支持有限,部分面板会灰掉或数据为空
插件装了没反应,或者 VisualGC 插件显示 “Not supported for this JVM”
VisualGC 是最常用的插件,但它严重依赖 JVM 的内部诊断接口。JDK 版本一升级,接口可能改名、删掉或行为变化,插件就失效。
立即学习“Java免费学习笔记(深入)”;
- 插件中心(Tools → Plugins)里看到灰色“Installed”但没生效?先点插件列表右下角的
Reload Catalog,再勾选重装 - JDK 17+ 用户:官方已移除
sun.jvmstat.monitor包,VisualGC无法工作。替代方案是启用 JFR(Java Flight Recorder):-XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=/tmp/recording.jfr
,然后在 VisualVM 里用Flight Recorder插件打开录制文件 - 别手动复制
.nbm文件到visualvm/etc/目录——插件依赖 NetBeans 平台版本,自行拷贝大概率引发类冲突
visualvm --console 输出的日志,比 GUI 界面更早暴露真实问题。











