我已经花了很长时间来加载和测试我的应用程序,现在我需要对其进行分析。但不幸的是,VisualVM 在我的本地应用程序上总是说“不支持此 JVM”?
这些应用程序是在与 VisualVM 相同的 JVM 上启动的。
我发现(至少在 Windows 下)可以轻松编写小批处理文件来结合特定的 JVM 运行 VisualVM,这对我来说很重要,因为我已经安装了 32 位 JDK 和 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 位。
“开始”命令的唯一好处是批处理文件无需等待应用程序完成即可启动应用程序,因此命令提示符窗口会立即关闭。这不是 VisualVM 的功能,而是 Windows 批处理文件解释器的功能。
在我的例子中,即使 JVM 匹配(都是 64 位),让事情正常工作的唯一方法是将参数发送-Dcom.sun.management.jmxremote
到 JVM 以进行监控。如果您在通过 Java Mission Control (JMC) 连接时遇到问题,这也可以。
根据JMX 的文档,这就是参数的作用:
设置此属性注册 Java VM 平台的 MBean 并通过私有接口发布远程方法调用 (RMI) 连接器,以允许 JMX 客户端应用程序监视本地 Java 平台,即与 JMX 客户端在同一台机器上运行的 Java VM .
这应该是自动启用的,但由于某种原因它不在我的 Linux 上。
VisualVM 需要与要分析的程序使用相同的 JVM(至少具有相同 32 位/64 位大小的 Java 6)运行。(您还需要是同一用户,但此消息不适用)。
在您的情况下,我会三重检查它是否与完全相同的 JVM。
在 Linux 上:确保您的 /etc/hosts 正确引用了“主机名”的有效 IP 地址 看来这里的差异完全让可怜的 jvisualvm 及其程序员感到困惑。
对于本地tomcat,我也遇到了同样的问题,我正在寻找stackoverflow的解决方案。经过一些认真的调试,我发现 VisualGC 没有权限从 tool.jar 文件中获取 GC 信息。
通过链接
http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstatd.html#SECURITY https://stackoverflow.com/a/42107355/3876619
我按照步骤解决问题
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
由于@user3356656 的提示,我刚刚发现的一个问题是,如果您在计算机位于一个 IP 上时启动程序,然后在它位于另一个 IP 上时尝试连接,它将失败。
如您所见,您在 32 位 JVM 上运行 VisualVM
您不需要卸载 32 位 JVM。只需告诉 VisualVM 使用游览 64 位 JVM。
如果您想永久更改它,您可以编辑
在visualvm_13\etc\visualvm.conf并在此处指定 jvm 的路径
我也遇到了这个问题。我的情况是在linux上,我用tomcat_user启动了tomcat,但我用root用户运行jvisualvm。它在我以 root 用户启动 tomcat 后工作。
我在 Windows 7 上检测到我的本地 tomcat 安装时遇到了 Visualvm 的问题。我可以手动连接,但是没有启用内存快照和 visualgc 插件等功能。我确认我使用的是相同的 JVM 版本、临时文件权限等。没有用。然后发现先启动visualvm,再启动tomcat,问题就解决了。
我的问题是 JVM 优化 --XX:+PerfDisableSharedMem
标志会破坏 VisualGC。如果 jps 不会在列表中显示您的应用程序,这很明显。
我可以重现下一个行为。我有一个带有右键单击菜单项的 java 应用程序来打开 jvisualvm。我将这个 java 应用程序作为一个 bat 文件的独立设置运行。这意味着我相应地修改 %path% 和其他需要的环境变量(如 JDK)以形成我的环境。启动应用程序的 BAT 标记为非管理员运行。环境指向 64 位 JDK。然后我以管理员身份启动其他 java 应用程序。VM 使用相同的 64 位 JDK 源。然后我通过右键单击 ie.as non-admin 从第一个应用程序启动 jvisualvm。我可以在 jvisualvm 的“应用程序列表”中看到该应用程序,但单击“系统属性”会出错。消息是“此 JVM 不支持”。JVM 参数被公开。
解决方案就像以前的其他评论一样:以管理员身份启动我的右键单击 jvisualvm-starter 我还可以看到“系统属性”。当然,如果 JDK 是 32 位的,而其他 64 位的,它就行不通了。到过那里。
我认为这个概念需要在这里添加。
对我来说,原因是我使用 JVM 进程与不同的用户一起运行了“jstatd”。我在 linux 中有一个特殊用户来启动 JVM 线程(它是一个 tomcat),但我用 root 启动 jstatd 进程。如果使用root运行jps,则看不到属于其他用户的JVM线程的任何信息。这就是麻烦。我杀死了root启动的“jstatd”进程,su到JVM进程的所有者,然后重新启动“jstatd”进程,现在一切正常。
我已将名称更改为我的 Windows 用户并将其全部设置为小写,重新启动我的电脑,现在一切正常。
就我而言,该应用程序以管理员权限运行。因此,visualVM 也需要以管理员身份运行。