【问题标题】:Debugging JConsole Connection Failed调试 JConsole 连接失败
【发布时间】:2011-03-28 07:26:38
【问题描述】:

我有一个 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)

你们知道如何调试这个(即找出问题所在)吗?

【问题讨论】:

    标签: java jmx connect jconsole


    【解决方案1】:

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

    【讨论】:

    • 喂!缺少的属性“java.rmi.server.hostname”呢?留意这篇文章:gubatron.com/blog/2010/11/21/… !!希望对您有所帮助!
    • 还要确保密码文件被读保护! IE。只有用户可以阅读 - 使用 chmod 600
    • 为什么每个人都在谈论远程连接?我正在尝试在本地连接,但它仍然无法正常工作。 “连接失败:重试?连接15663没有成功。”为什么?日志在哪里?错误在哪里?真是个笑话。
    【解决方案2】:

    如果您运行jconsole -debug,它会为您提供有关故障的更多诊断信息。看 the Daniel Fuchs blog entry "Troubleshooting connection problems in JConsole".

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

    【讨论】:

      【解决方案3】:

      这终于使它对我有用:给这个额外的选项: -Djava.rmi.server.hostname=&lt;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>
      

      整个流程列出here

      【讨论】:

      • 这对我也有用。似乎当您进行 NAT 时,您需要指定服务器地址。
      • 经过长时间的搜索,从不同的机器连接时,添加 -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
      【解决方案4】:

      我在通过 cygwin 启动 Java-Process 时遇到了同样的问题。 JConsole 无法连接。通过 win7-cmd 启动它,一切正常。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 还是不行。而且我也不知道如何调试。
        • 这篇文章 (blogs.sun.com/jmxetc/entry/…) 解释了常见的连接问题可能会有用。如果没有任何效果,请查看/发布调试日志
        【解决方案6】:

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

        -Dcom.sun.management.jmxremote

        【讨论】:

        • 不起作用(在 JDK1.5 和 JDK1.6 上都试过)。而且我也不知道怎么调试。
        【解决方案7】:

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

        【讨论】:

        • 在我的例子中,RMI 端口是 43702,我通过使用 logging.properties 进行调试发现了这一点
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-23
          • 1970-01-01
          相关资源
          最近更新 更多