调试JConsole连接失败

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

我可以telnet到远程服务器即

franz@see:/tmp$ telnet  5555 Trying ... Connected to . 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://: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) 

你们有没有想过如何调试这个(即找出错误的地方)?

确保使用以下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会弹出一个单独的窗口显示日志。

如果运行jconsole -debug它会为您提供有关失败的更多诊断信息。 参考: http : //blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

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

这最终使它对我-Djava.rmi.server.hostname= :给出这个额外的选项: -Djava.rmi.server.hostname=

因此,用于从远程计算机打开jconsole的所有vm参数都必须启动远程计算机上的jvm

  -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote -com.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname= 

这里列出了整个过程

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

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

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

-Dcom.sun.management.jmxremote

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