所有本地应用程序上的VisualVM“不支持此JVM”?

50

我已经花费了很长时间来加载和测试我的应用程序,现在我需要对其进行分析。但不幸的是,VisualVM在我的本地应用程序上总是显示“不支持此JVM”?

这些应用程序是在与VisualVM相同的JVM上启动的。


如果您使用的是Linux系统,请检查JVM的备选项,并尝试使用每个应用程序的完整路径(JVM的完整路径+VisualVM的完整路径)启动。符号链接可能不指向相同的目录。 - Grooveek
抱歉,我记不起来了。但是我在 Thorbjørn Ravn Andersen 的答案中看到了自己的评论:“根本问题在于我的登录用户名,它是大写字母!” - Loc Phan
16个回答

23

我发现(至少在Windows下)可以轻松编写小批处理文件来运行VisualVM和特定的JVM组合,这对我很重要,因为我同时安装了32位和64位JDK(我需要两者,所以这对我来说是有意义的)。 我在"S:\applications\visualvm\bin\"文件夹中创建了两个批处理文件:

run_32.bat:

@echo off
START "VisualVM 32" visualvm.exe --jdkhome "C:\Program Files (x86)\Java\jdk1.7.0_07"

run_64.bat:

@echo off
START "VisualVM 64" visualvm.exe --jdkhome "C:\Program Files\Java\jdk1.7.0_07"

显然,所有路径可能因您的系统而异,但总体思路应该仍然能够正确工作(在所有64位Windows版本上)。好处是我可以在想要使用VisualVM与运行在32位JVM上的Java应用程序进行组合时使用32位批处理文件,同样适用于64位。

"start"命令的唯一好处是批处理文件启动应用程序时无需等待其完成,因此命令提示窗口会立即关闭。这不是VisualVM的功能,而是Windows批处理文件解释器的特性。


请注意,路径不能包含尾部的“\”,否则它将被拒绝作为有效的JDK目录。 —— @MSillence 的评论 - Damon
3
如果应用程序和VisualVM是通过完全相同的JVM运行的,那会怎样呢? - user330315
在Ubuntu 18.08上遇到了同样的问题,这个方法对我有效(在终端中运行):visualvm --jdkhome /usr/local/java/jdk1.7.0_80/ - Mark

14
在我的情况下,即使JVM匹配(都是64位),唯一让事情正常运行的方法是向要监视的JVM发送参数-Dcom.sun.management.jmxremote。如果您无法通过Java Mission Control(JMC)连接,则也可以使用该方法解决问题。
根据JMX文档,该参数的作用如下:

设置此属性将注册Java VM平台的MBeans并通过私有接口发布远程方法调用(RMI)连接器,以允许JMX客户端应用程序监视本地Java平台,即在与JMX客户端运行在同一台计算机上的Java VM。

这应该自动启用,但出于某种原因,在我的Linux上没有启用。

是的,由于某种原因,我只能使用 JMX 连接 :( 在我添加了 -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.ssl=false 后才能正常工作。 - Anton

12

需要使用与待分析程序相同的JVM来运行VisualVM,至少是Java 6,并且具有相同的32位/64位大小。(您还需要是相同的用户,但这则消息不适用于此情况)。

在您的情况下,我会三重检查它是否是完全相同的JVM。


1
我已经删除了所有的jdk/jre,然后只安装了一个。但它仍然失败了 :-( - Loc Phan
同时安装了JVM 1.6_17。它们都是从同一个软件包中安装的。该应用程序由浏览器插件启动,但我也尝试过其他桌面应用程序,它们都失败了。然而,我可以在另一台电脑上进行分析。 - Loc Phan
1
VisualVM团队在http://visualvm.java.net/troubleshooting.html上提供了故障排除指南,你可能会很幸运。 - Thorbjørn Ravn Andersen
1
非常感谢,这很有帮助。很遗憾,当我用错误信息中的关键字搜索时,我找不到它!根本问题是我的登录用户名,它是大写字母! - Loc Phan
只有在Windows上才会发生32位/64位附加问题。在其他所有平台上都正常工作。这是Attach API的问题,VisualVM使用该API来监视JVM。请参阅以下JDK错误:http://bugs.sun.com/view_bug.do?bug_id=6277710 - Tomas Hurka
显示剩余6条评论

3
我也遇到了本地Tomcat相同的问题,我在stackoverflow上搜索解决方案。经过一些严格的调试,我发现VisualGC没有权限从tool.jar文件获取GC信息。
通过链接。

http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstatd.html#SECURITY https://dev59.com/q3HYa4cB1Zd3GeqPLW5W#42107355

我按照以下步骤解决问题:
1)创建一个权限文件。
vim /tmp/tools.policy

添加
grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};

"保存它
2)现在将 /tmp/tools.policy 添加到 JVM 启动参数中。"
-Djava.security.policy=/tmp/tools.policy

3) 使用sudo运行jvisualvm


3
在Linux上: 确保你的/etc/hosts正确引用了你的“主机名”的有效IP地址。 这里的任何差异都会完全混淆可怜的jvisualvm及其程序员。

这样设置并加载jvisualvm就可以工作了: $ jvisualvm --cp:a ~/luca4pro/wildfly-9.0.2.Final/bin/client/jboss-client.jar - gersonZaragocin

2

正如您所看到的,您正在32位JVM上运行VisualVM

您不需要卸载32位JVM。只需告诉VisualVM使用您的64位JVM。

如果您想永久更改它,可以编辑

visualvm_13\etc\visualvm.conf 中指定jvm路径即可


2

我发现的一个问题,感谢@user3356656的提示,就是如果您在计算机处于一个IP地址时启动程序,然后尝试连接到另一个IP地址,它会失败。


我也会采用以下方法:
  1. 关闭WiFi
  2. 启动目标进程。
  3. 启动VisualVM。
  4. 打开WiFi。
谢谢。
- ruseel

2

我曾经遇到一个问题,就是visualvm在Windows 7上无法检测到我本地安装的tomcat。我可以手动连接,但是像内存快照和visualgc插件等功能都无法使用。我确认了我使用的JVM版本、临时文件权限等都是相同的,但还是不行。后来我发现先启动visualvm,然后再启动tomcat就解决了这个问题。


2

我也遇到了这个问题。我的情况是在Linux上,我用tomcat_user启动了Tomcat,但我用root用户运行jvisualvm。只有在我使用root用户启动Tomcat后才能正常工作。


1
这也是我的问题。但是最好将visualvm作为tomcat_user运行,而不是以root身份运行tomcat。 - Bernie

1

在我的情况下,应用程序正在以管理员权限运行。因此,VisualVM也需要作为管理员运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接