成功将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)
在进行远程访问时,我是否应该特别考虑或有某种限制?
答案 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回答出错了。