"此JVM不支持"尝试连接到VisualVM上的远程主机时

时间:2016-04-13 08:24:35

标签: java jvm visualvm jvisualvm

成功将VisualVM连接到远程主机后,我不断得到这个JVM" CPU面板上的标签,系统属性等。此外,我似乎无法访问"线程"面板,我需要进行线程转储。

我尝试从JDK7和JDK8运行32位和64位版本的VisualVM(目标进程在64位模式的Linux机器上运行)。在VisualVM配置的两种情况下,问题似乎都是一样的。

这就是java -version让我上机的原因:

java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)

在进行远程访问时,我是否应该特别考虑或有某种限制?

2 个答案:

答案 0 :(得分:1)

这并不意味着您在运行VisualVM时使用的JVM“不支持此JVM”,它意味着远程服务器的VM。

你可能在那里运行非oracle VM(可能是openjdk),在这种情况下VisualVM无法正常工作。要么在服务器上更改为Oracle的JRE,要么获得可以处理OpenJDK的分析器。

答案 1 :(得分:0)

当您连接到远程JVM时,VisualVM通常会通过JMX接口来获取线程等。但是,远程JVM决定它将为客户端提供什么,而不是默认情况下可用的所有内容;因此,您所连接的JVM可能不支持报告这些特征。

假设连接正常,你会发现JVM返回了各种isXxxSupported方法,在这种情况下可能是假的。

您可能想尝试的一件事是在远程服务器(或jcmd)上运行jps以查看是否对框中的进程有某种限制阻止您将该其他VM视为该用户。可能是因为如果它在容器之类的东西中运行,那么RMI要求JMX不会被传递,或者如果你在selinux或Java安全策略中运行它,那么它就是&和#39;不允许您在网络端口或文件上阅读/通信。

JMXServiceURL url = new JMXServiceURL("rmi", "", 0, "/jndi/rmi://" + host + ":" + port + "/jmxrmi");
JMXConnectionFactory factory = JMXConnectorFactory.connect(url);
MBeanSearverConnection conn = factory.getMBeanServerConnection();
ThreadMXBean threads = ManagementFactory.newPlatformMXBeanProxy(conn, ManagementFactory.THREAD_MXBEAN_NAME,ThreadMXBean.class);
long ids[] = threads.getAllThreadIds();

如果您可以获取线程ID,那么它建议您可以与服务器通信; threads上还有其他方法可以让你获得堆栈跟踪等。这将是VisualVM使用的方法,可以让你进一步调试什么是' s回答出错了。