java 调试JConsole连接失败

kcwpcxri  于 2023-06-04  发布在  Java
关注(0)|答案(9)|浏览(844)

我有一个部署到远程resin服务器上的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)

你们有什么想法,如何调试这个(即找出什么是错的)。

qgzx9mmu

qgzx9mmu1#

确保您运行的应用程序具有以下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

以下是www.example.com文件的内容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后,将弹出一个单独的窗口,显示日志。

rqcrx0a6

rqcrx0a62#

如果你运行jconsole -debug,它会给你更多关于故障的诊断信息。参见the Daniel Fuchs blog entry "Troubleshooting connection problems in JConsole"
我这样做了,它显示我正在使用32位jconsole,目标进程是用不同的(64位)jvm启动的,所以显然这是不允许的,因此它失败了。

dwbf0jvd

dwbf0jvd3#

这终于让它为我工作了:提供此额外选项:-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>

整个过程列在这里

htzpubme

htzpubme4#

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

kq0g1dla

kq0g1dla5#

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

mmvthczy

mmvthczy6#

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

-Dcom.sun.management.jmxremote

6psbrbz9

6psbrbz97#

我遇到了类似的问题,远程计算机位于防火墙后面,防火墙阻止了-Dcom.sun.management.jmxremote.port和RMI 46924定义的端口。在允许我连接到这些端口后,我成功地连接了。

kkih6yb8

kkih6yb88#

如果要访问防火墙后面的计算机,则需要同时打开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
hivapdat

hivapdat9#

对我来说,我使用的是本地进程连接,遇到了与OP相同的问题。我的误解是,“连接不能被拒绝,如果它是本地的,对不对?“不一定。
另一位用户JeneralJames在评论Samarth的回答时提到了与我完全相同的症状。
什么解决了它是从VPN断开(或替代启用局域网访问,而连接到VPN -一个非默认配置为我的VPN设置)。
我按照rogerdpack的建议运行jconsole -debug发现了这个问题,它显示了一个我在连接尝试中不期望的IP(尽管是一个到本地进程的连接)。当时我的VPN设置完全不允许本地网络上的连接,所以java正在查找本地IP,获取值,但由于VPN配置,该IP不允许连接,因此“本地连接”被拒绝。
显然,jconsole(或任何其他使用JMX应用程序的MBean)默认情况下将使用这个错误的IP,即使是本地连接。我希望这对其他人有帮助,我花了3天的时间细读多个stackoverflow线程和java文档,直到发现-debug选项才无济于事。

相关问题