Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java VisualVM“;“此JVM不支持”;在所有本地应用程序上?_Java_Profiler_Visualvm - Fatal编程技术网

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

Java VisualVM“;“此JVM不支持”;在所有本地应用程序上?,java,profiler,visualvm,Java,Profiler,Visualvm,我已经花了很长时间来加载和测试我的应用程序,现在我需要分析它。但不幸的是,VisualVM总是在我的本地应用程序上说“不支持这个JVM” 应用程序是在使用VisualVM的同一JVM上启动的。VisualVM需要使用与要评测的程序相同的JVM(至少是32位/64位大小的Java 6)运行。(您还需要是同一用户,但此消息不适用) 我会仔细检查它是否与您的情况完全相同。我发现(至少在Windows下)可以轻松编写小批量文件,与特定的JVM一起运行VisualVM,这对我来说很重要,因为我已经安装了3

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


应用程序是在使用VisualVM的同一JVM上启动的。

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

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

我发现(至少在Windows下)可以轻松编写小批量文件,与特定的JVM一起运行VisualVM,这对我来说很重要,因为我已经安装了32位JDK和64位JDK(我需要两者,所以这对我来说很合理). 我在文件夹“S:\applications\visualvm\bin\”中创建了两个批处理文件:

运行_32.bat:

@echo off
START "VisualVM 32" visualvm.exe --jdkhome "C:\Program Files (x86)\Java\jdk1.7.0_07"
运行_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批处理文件解释器的功能。

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

多亏了@user3356656的提示,我刚刚发现的一个问题是,如果您在一个IP上启动程序,然后在另一个IP上尝试连接,它将失败。

在我的情况下,即使JVM匹配(均为64位),使事情正常运行的唯一方法是将参数
-Dcom.sun.management.jmxremote
发送到要监视的JVM。如果您在通过Java任务控制(JMC)连接时遇到问题,也可以这样做

根据这一点,论点的作用是:

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


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

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

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

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

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

您不需要安装32位JVM,只要告诉VisualVM使用64位JVM即可

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


visualvm\u 13\etc\visualvm.conf中,在这里指定jvm的路径

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

解决方案与前面的一些评论类似: 以管理员身份启动右键单击的jvisualvm starter,我还可以看到“系统属性”。 当然,如果JDK是32位的,而其他64位的,那么它就不起作用了


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

对于本地tomcat,我也遇到了同样的问题,我搜索stackoverflow的解决方案。经过一些认真的调试,我发现VisualGC没有从tool.jar文件获取GC信息的权限

通过链接

我将遵循以下步骤来解决此问题

1) 创建权限文件

vim /tmp/tools.policy

省省吧

2) 现在将/tmp/tools.policy添加到JVM启动参数中

-Djava.security.policy=/tmp/tools.policy

3) 使用sudo运行jvisualVm

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

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

在我的情况下,应用程序是以管理员权限运行的。因此,visualVM还需要以管理员身份运行。

如果您使用的是Linux,请检查JVM的备选方案,并尝试使用每个应用程序的完整路径启动
-Djava.security.policy=/tmp/tools.policy