2011-03-28 163 views
13

我有一个Web应用程序部署到远程树脂服务器,并且它已打开JMX。调试JConsole连接失败

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

[email protected]:/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) 

你们是否有任何想法来了解如何调试(即找出哪里出了问题)?

回答

26

确保您使用下面的Java性能运行你的应用程序设置

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

立即尝试连接。 如果你想调试这一点,你可以用下面的命令

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日志。

+0

Ey!那么缺少的属性'java.rmi.server.hostname'呢?注意这篇文章:http://www.gubatron.com/blog/2010/11/21/jconsole-connection-failed-retry-solved-java-jmx/!希望能帮助到你! – Victor 2014-11-27 20:07:13

+0

还要确保密码文件被读保护!即。只有用户可以阅读它 - 用chmod 600 – Mafro34 2015-01-28 07:21:37

1

我不知道这是有益的,但也许你应该使用在JDK bin目录中的JConsole的二进制文件,而不是使用无证(如有更改)的阳光。*类启动控制台

+0

仍然没有工作。我也不知道如何调试。 – 2011-04-14 02:59:58

+0

解释常见连接问题的这篇文章(http://blogs.sun.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole)可能会有用。如果没有正常工作,请查看/发布调试日志 – qwerty 2011-04-14 03:55:57

1

如果您的应用程序是在JDK 1.6上运行的,那么您应该能够连接它。是否它被利用JDK之前1.6然后用指定以下JVM参数

-Dcom.sun.management.jmxremote

+0

不起作用(在JDK1.5和JDK1.6上都尝试过)。而且我也不知道如何调试它。 – 2011-04-14 02:43:08

3

运行它开始通过cygwin的所述Java的过程时所遇到的相同的问题。 JConsole无法连接。通过win7-cmd启动它,一切都按预期工作。

1

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

+0

这样做在我的情况下,RMI端口是43702,我发现通过使用logging.properties调试 – 2015-03-30 18:49:48

8

这终于使这对我的工作:给这个额外的选项:-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 -com.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<ip address> 
开始

整个过程列出here

+1

这也适用于我。似乎当你有NAT时,你需要指定服务器地址。 – hacket 2014-09-09 17:27:49

+0

经过长时间的搜索,从不同的机器连接时,添加-Djava.rmi.server.hostname = 终于适用于我。以下是全部参数: java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only = false \ -Dcom.sun.management.jmxremote.port = 9999 \ -Dcom。 sun.management.jmxremote.authenticate = false \ -Dcom.sun.management.jmxremote.ssl = false \ -Djava.rmi.server.hostname = \ com.example.Main – 2017-02-05 02:45:05