【问题标题】:VisualVM "not supported for this JVM" on all local applications?所有本地应用程序上的 VisualVM“不支持此 JVM”?
【发布时间】:2011-08-31 15:23:32
【问题描述】:

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

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

【问题讨论】:

  • 如果您使用的是 Linux,请检查 JVM 的替代方案,并尝试使用每个应用程序的完整路径(JVM 的完整路径 + VisualVM 的完整路径)启动。符号链接可能不指向同一个目录
  • 对不起,我不记得了。但是,我在 Thorbjørn Ravn Andersen 的回答中看到了我自己的评论:“根本问题是我的登录用户名,它是大写字母!”。

标签: java profiler visualvm


【解决方案1】:

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

我会三重检查它是否与您的情况完全相同。

【讨论】:

  • 我确实删除了所有 jdk/jre 然后只安装了一个。但它仍然失败:-(
  • -winxp service pack2, jdk 1.6.0_17
  • 你安装了哪个JVM?您是否通过浏览器插件安装了 JVM?你如何开始你的申请?
  • visualvm.java.net/troubleshooting.html 的 VisualVM 团队提供了故障排除指南 - 你可能很幸运。
  • 非常感谢。它有助于。糟糕的是,我在错误消息中按关键字搜索时找不到它!根本问题是我的登录用户名,它是大写字母!
【解决方案2】:

我发现(至少在 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 批处理文件解释器的特性。

【讨论】:

  • @MSillence 的评论:请注意,路径不能包含尾随“\”,否则将否认该路径是有效的 jdk 主目录
  • 如果应用程序和 VisualVM 通过完全相同的 JVM 运行会怎样?
  • 在 Ubuntu 18.08 上遇到了同样的问题,这对我有用(在终端中运行):visualvm --jdkhome /usr/local/java/jdk1.7.0_80/
【解决方案3】:

在 Linux 上: 确保您的 /etc/hosts 正确引用了“主机名”的有效 IP 地址 看来这里的差异完全让可怜的 jvisualvm 及其程序员感到困惑。

【讨论】:

  • 这并以这种方式设置和加载 jvisualvm 完成了工作:$ jvisualvm --cp:a ~/luca4pro/wildfly-9.0.2.Final/bin/client/jboss-client.jar
【解决方案4】:

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

【讨论】:

  • 我也解决了 1. 关闭 wifi 2. 启动目标进程。 3. 启动视觉虚拟机。 4.打开wifi。谢谢。
【解决方案5】:

在我的例子中,即使 JVM 匹配(都是 64 位),让事情正常工作的唯一方法是将参数 -Dcom.sun.management.jmxremote 发送到要监控的 JVM。如果您在通过 Java Mission Control (JMC) 连接时遇到问题,这也有效。

根据JMX's documentation,参数的作用如下:

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

这应该是自动启用的,但由于某种原因它不在我的 Linux 上。

【讨论】:

  • 是的。出于某种原因,我得到了相同的结果,所以只有 JMX Connection 有效:( 在我添加 -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 之后
【解决方案6】:

我已将名称更改为我的 Windows 用户并将其全部设置为小写,重新启动我的电脑,现在一切正常。

【讨论】:

    【解决方案7】:

    我也遇到了这个问题。我的情况是在linux上,我用tomcat_user启动了tomcat,但我用root用户运行jvisualvm。它在我以 root 用户启动 tomcat 后工作。

    【讨论】:

    • 这也是我的问题。但是以 tomcat_user 身份运行 visualvm 可能比以 root 身份运行 tomcat 更好。
    【解决方案8】:

    Visualvm 检测到我在 Windows 7 上的本地 tomcat 安装时遇到问题。我可以手动连接,但未启用内存快照和 visualgc 插件等功能。我确认我使用的是相同的 JVM 版本、临时文件权限等。没有用。然后发现先启动visualvm,再启动tomcat,问题就解决了。

    【讨论】:

      【解决方案9】:

      如您所见,您在 32 位 JVM 上运行 VisualVM

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

      如果要永久更改,可以编辑

      visualvm_13\etc\visualvm.conf并在此处指定jvm的路径

      【讨论】:

        【解决方案10】:

        我可以重现下一个行为。 我有一个带有右键单击菜单项的 java 应用程序来打开 jvisualvm。 我将这个 java 应用程序作为一个 bat 文件的独立设置运行。 这意味着我修改 %path% 和其他需要的环境变量,如 JDK 相应地形成我的环境。 启动应用程序的 BAT 标记为非管理员运行。环境指向 64 位 JDK。 然后我以管理员身份启动其他 java 应用程序。 VM 使用相同的 64 位 JDK 源。 然后我通过右键单击 ie.as non-admin 从第一个应用程序启动 jvisualvm。 我可以在 jvisualvm 的“应用程序列表”中看到该应用程序,但单击“系统属性”会出错。消息是“此 JVM 不支持”。 JVM 参数被暴露。

        解决方案就像以前的一些其他 cmets: 以管理员身份启动我的右键单击 jvisualvm-starter 我还可以看到“系统属性”。 当然,如果 JDK 是 32 位的,而其他 64 位的,它就行不通了。去过那里。

        我认为这里需要添加这个概念。

        【讨论】:

        • 最后,当我在具有管理员权限的 WIndows 下启动 VisualVM 时,错误消失了,我能够看到我的 JVM 进程的所有详细信息。
        【解决方案11】:

        本地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

        【讨论】:

          【解决方案12】:

          我的问题是 JVM 优化 - -XX:+PerfDisableSharedMem 标志会破坏 VisualGC。如果 jps 不会在列表中显示您的应用,这很明显。

          【讨论】:

            【解决方案13】:

            对我来说,原因是我使用 JVM 进程与不同的用户一起运行了“jstatd”。我在 linux 中有一个特殊用户来启动 JVM 线程(它是一个 tomcat),但我用 root 启动 jstatd 进程。如果使用root运行jps,则看不到属于其他用户的JVM线程的任何信息。这就是麻烦。 我杀死了root启动的“jstatd”进程,su到JVM进程的所有者,然后重新启动“jstatd”进程,现在一切正常。

            【讨论】:

              【解决方案14】:

              在我的例子中,应用程序以管理员权限运行。因此,visualVM 也需要以管理员身份运行。

              【讨论】:

                猜你喜欢
                • 2017-01-15
                • 2019-08-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-06-05
                • 2019-04-24
                • 2017-09-10
                • 2016-02-25
                相关资源
                最近更新 更多