25

我有一个部署到远程树脂服务器的 Web 应用程序,它打开了 JMX。

我可以远程登录到远程服务器,即

franz@see:/tmp$ telnet <remote-ip> 5555
Trying <remote-ip>...
Connected to <remote-ip>.
Escape character is '^]'.
��sr5javax.management.remote.message.HandshakeBeginMessage�,���6profilestLjava/lang/String;Lversionq~xppt1.0^]

telnet> q
Connection closed.

但我无法使用我的 JConsole 连接到它

$JAVA_HOME/bin/java -cp $JAVA_HOME/lib/jconsole.jar:$JAVA_HOME/lib/tools.jar:pm-common/lib/jmxremote_optional-1_0_1_3.jar sun.tools.jconsole.JConsole service:jmx:jmxmp://<remote-ip>:5555

我已经使用以下 Java 版本进行了尝试,但在两个实例上都出现“连接失败”。

## where JAVA_HOME=/opt/java/64/jdk1.5.0_22
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)

## where JAVA_HOME=/opt/java/64/jdk1.6.0_17
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

你们对如何调试这个有任何想法(即找出问题所在)吗?

4

8 回答 8

40

确保您正在使用以下 java 属性集运行您的应用程序

-Dcom.sun.management.jmxremote.port=9005
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

立即尝试连接。如果要调试它,可以使用以下命令运行 jconsole

jconsole -J-Djava.util.logging.config.file=path_to_logging.properties_for_jconsole

以下是 logging.properties 文件的内容

Logging.properties

handlers = java.util.logging.ConsoleHandler


.level = INFO

java.util.logging.ConsoleHandler.level = FINEST

java.util.logging.ConsoleHandler.formatter = \

java.util.logging.SimpleFormatter

// Use FINER or FINEST for javax.management.remote.level - FINEST is

// very verbose...

javax.management.level = FINEST

javax.management.remote.level = FINER

一旦你运行jconsole一个单独的窗口将弹出显示日志。

于 2011-09-16T12:33:49.303 回答
25

如果您运行jconsole -debug它,它会为您提供有关故障的更多诊断信息。请参阅 Daniel Fuchs 博客条目“在 JConsole 中排除连接问题”

我这样做了,它告诉我我正在使用 32 位 jconsole,目标进程是用不同的(64 位)jvm 启动的,所以显然这是不允许的,因此它失败了。

于 2012-01-10T22:48:42.273 回答
9

这终于使它对我有用:给这个额外的选择: -Djava.rmi.server.hostname=<ip addres where jvm is running

所以所有用于从远程机器打开jconsole的vm参数,远程机器上的jvm必须以

 -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.port=<port> -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<ip address>

整个过程在 这里列出

于 2014-08-28T08:22:58.733 回答
3

通过 cygwin 启动 Java-Process 时遇到了同样的问题。JConsole 无法连接。通过 win7-cmd 启动它,一切都按预期工作。

于 2011-06-01T11:55:25.210 回答
1

我不知道这是否有帮助,但也许您应该使用 JDK bin 目录中的 jconsole 二进制文件,而不是使用未记录(并且可能会更改)的 sun.* 类来启动控制台

于 2011-03-28T08:12:32.863 回答
1

如果您的应用程序在 JDK 1.6 上运行,那么您应该能够连接它。如果它使用1.6 之前的 JDK ,则使用以下 JVM 参数运行它

-Dcom.sun.management.jmxremote

于 2011-03-28T08:51:03.647 回答
1

我遇到了类似的问题,即远程机器位于防火墙后面,并且防火墙阻止了-Dcom.sun.management.jmxremote.portRMI定义的端口46924。在允许我连接到这些端口后,我成功连接。

于 2013-07-18T05:58:13.513 回答
0

如果要访问防火墙后面的机器,则需要同时打开 JMX 和 RMI 端口。
在这种情况下,强制 RMI 的值比依赖自动分配的值要好得多。
在我的情况下,我试图访问 Tomcat,所以我必须执行以下操作:

#!/bin/sh
CATALINA_OPTS="$CATALINA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8008 -Dcom.sun.management.jmxremote.rmi.port=8007 -Dcom.sun.
management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

进而

firewall-cmd --zone=public --add-port=8008/tcp --permanent
firewall-cmd --zone=public --add-port=8007/tcp --permanent
firewall-cmd --reload
于 2019-03-13T18:05:58.690 回答