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

问题描述 投票:38回答:13

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

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

java profiler visualvm
13个回答
14
投票

我发现(至少在Windows下)可以轻松编写小批量文件来运行VisualVM并结合特定的JVM,这对我来说很重要,因为我已经安装了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位。

“start”命令具有批处理文件启动应用程序而不等待它完成的唯一好处,因此命令提示符窗口立即关闭。这不是VisualVM的功能,而是Windows批处理文件解释器的功能。


1
投票

我也为本地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运行visualVm


1
投票

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


0
投票

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


0
投票

对我来说,原因是我使用JVM进程与不同的用户运行“jstatd”。我在linux中有一个特殊的用户来启动JVM线程(它是一个tomcat),但是我用root启动了jstatd进程。如果使用root运行jps,则无法看到属于其他用户的JVM线程的任何信息。那是麻烦。我杀死了由root启动的“jstatd”进程,su给了JVM进程的所有者,并重启了“jstatd”进程,现在一切都很好。


11
投票

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

我会三重检查它是你的情况下完全相同的JVM。


11
投票

就我而言,即使JVM匹配(均为64位),使事情正常工作的唯一方法是将参数-Dcom.sun.management.jmxremote发送到要监视的JVM。如果您通过Java Mission Control(JMC)进行连接时遇到问题,这也可以。

JMX's documentation说,这就是论证的作用:

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

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


3
投票

在Linux上:确保您的/ etc / hosts正确引用了“主机名”的有效IP地址这里的差异似乎完全混淆了糟糕的jvisualvm及其程序员。


2
投票

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


2
投票

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


2
投票

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


2
投票

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

您不需要取消同步32位JVM。告诉VisualVM使用tour 64bit JVM。

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

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


1
投票

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

解决方案就像之前的其他一些评论一样:开始我的右键单击jvisualvm-starter作为管理员我也可以看到“系统属性”。当然,如果JDK是32位而其他64位则不起作用。到过那里。

我认为这个概念需要在这里添加,因为这个小半工作的混蛋正在进行中。

© www.soinside.com 2019 - 2024. All rights reserved.