【问题标题】:How to use VisualVM and JMX?如何使用 VisualVM 和 JMX?
【发布时间】:2015-05-07 14:34:13
【问题描述】:

我已经尝试了书中的每一个食谱,但今天的事情就不行了......

我正在尝试使用 VisualVM 来分析我在远程服务器中运行的 Java 应用程序,因此我搜索了谷歌并搜索了执行此操作的方法,最终得到了这个解决方案:

java -Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.port=9199 \
  -Dcom.sun.management.jmxremote.local.only=false \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -jar bin/felix.jar

我猜运行这个会让我运行 JMX,所以我可以看到他在 9199 上运行:

java      21947        root    9u  IPv6 1811434      0t0  TCP *:7192 (LISTEN)
java      26376        root   14u  IPv6 1844518      0t0  TCP *:9199 (LISTEN)

此外,我可以测试该端口在网络上是否可见:

现在,当我尝试在我的机器上的 VisualVM 中打开连接(也可以 ping jmx 服务器)时,会发生这种情况:

我一定是太笨了,这个世界上的每个人都能让这东西运转,除了我。妈的……

编辑:我安装了 wireshark 以了解引擎盖下发生了什么,所以我看到了这个。一旦我在 VisualVM 中添加远程 IP,wireshark 就会开始检测到这种重复活动:

但是,如果我尝试添加一个新的 JMX 连接并要求他进行连接,wireshark 甚至不会抓取该连接尝试的一个数据包。

在我看来,VisualVM 甚至没有尝试连接,尽管给出了错误消息“无法连接”......!!到底是怎么回事?

【问题讨论】:

  • 也许这就是问题 - 确保您的主机 IP 配置正确stackoverflow.com/questions/834581/remote-jmx-connection
  • 我之前尝试过 :( 尽管端口对网络可见,但似乎没有任何效果。
  • 出于好奇,您的桌面和启用 JMX 的进程之间是否有防火墙?我知道你说 9199 端口是开放的;但是,JMX 需要随机分配且不可配置的第二个端口。当尝试通过防火墙使用 JMX 时,这会导致巨大的问题。可能不是你的问题只是把它扔在那里看:blogs.oracle.com/jmxetc/entry/…
  • 我不知道存在任何防火墙。负责网络的系统管理员说中间没有防火墙。 JMX 必须与 DCOM 技术密切相关。他们怎么能把这么简单的事情变成过度设计和无效的解决方案......该死......

标签: java rmi jmx visualvm jvisualvm


【解决方案1】:

使用这些选项启动您的服务:

-Djava.rmi.server.hostname=193.163.XXX.XXX
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9199 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

然后您可以使用 jvisualvm 或 jconsole 仅使用“193.163.XXX.XXX:9199”地址。

【讨论】:

    【解决方案2】:

    按照以下步骤操作。
    1) 到远程机器开启X11转发,
    2) 在 windows 中安装 XMING
    3) 在远程机器中启动可视 VM,GUI 将出现在您的 windows xming 中。
    4) 使用 localhost 代替 IP 并使用相同的端口号。

    如果上述步骤不起作用,则表示配置有问题。
    如果上述步骤正常,则转到 iptables 并确保端口 9199 对外部世界开放。 以及使用java -Djava.rmi.server.hostname=YOUR_IP启动程序

    更多详情请参考link

    【讨论】:

      【解决方案3】:

      请使用以下 JVM 选项:

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

      在 VisualVM 中使用以下连接:

      service:jmx:rmi:///jndi/rmi:/<IP>:<PORT>/jmxrmi
      

      希望这会有所帮助。

      【讨论】:

      • 感谢您的建议。它不起作用,给出完全相同的错误消息。 i.imgur.com/Cm46gpM.pngi.imgur.com/yrTAFIv.png 9199 端口仍然可以在全球范围内访问。
      • 你使用过我提供的java选项吗?它与您的略有不同:-Djava.rmi.server.hostname=
      • 是的。 java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9199 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi。 server.hostname=193.136.102.224 -jar bin/felix.jar
      • 在 VisualVM 中:service:jmx:rmi:///jndi/rmi:/193.136.102.224:9199/jmxrmi
      • 很抱歉,我无法为您提供帮助。你能试试 hawtio 吗:hawt.io/getstarted。简而言之,它通过 HTTP 公开 JMX。我曾经监控过tomcat。根据文档,您需要执行以下操作: java -jar hawtio-app-1.4.50.jar --port 8090
      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多