使用 visualvm 和 JMX 进行远程监控

新手上路,请多包涵

我想用 jvisualvm(或 jconsole)监控远程运行的 java(spring boot)应用程序。在本地运行时,我可以在 jvisualvm 和 jconsole 中看到托管 bean。远程运行时我无法连接。我尝试了几个不同的 java 进程(例如 spring xd)。在 SO 和 Google 上寻找答案无济于事。

这些是我的 JAVA_OPTS(在远程主机上):

 $ echo $JAVA_OPTS
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.59.99

然后我简单地启动程序如下(这是针对spring xd的,但我在其他java程序中遇到了同样的问题)。

 $ bin/xd/xd-singlenode

服务器进程似乎选择了以下选项:

 $ ps -ef | grep single
vagrant  22938 19917 99 06:38 pts/2    00:00:03 /usr/lib/jvm/java-8- oracle/jre/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.59.99 -Dspring.application.name=admin -Dlogging.config=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config///xd-singlenode-logger.properties -Dxd.home=/home/vagrant/spring-xd-1.1.0.RELEASE/xd -Dspring.config.location=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config// -Dxd.config.home=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config// -Dspring.config.name=servers,application -Dxd.module.config.location=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config//modules/ -Dxd.module.config.name=modules -classpath (...)

远程主机(ubuntu linux vm)上的java版本是:

 $ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

本地机器(Mac OS)上的java版本略有不同:

 $ java -version
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b25)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

在 jvisualvm 中,我按如下方式添加远程连接(尝试使用 ssl 连接和不使用):

在此处输入图像描述

这是 jvisualvm 给我的错误消息:

jvisualvm 给出的错误信息

当远程进程正在运行时,我可以使用命令 telnet 192.168.59.99:9010 从本地主机连接到远程主机——所以这似乎不是防火墙问题。

非常感谢任何帮助。

原文由 user152468 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 837
2 个回答

请使用以下 JVM 选项:

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

在 Jconsole 中使用以下连接:

 service:jmx:rmi:///jndi/rmi://192.168.59.99:9010/jmxrmi

原文由 Arnab Biswas 发布,翻译遵循 CC BY-SA 3.0 许可协议

Arnab Biswas 的回答不适用于我的情况。经过一个小时的研究,我发现 JMX 在 RMI 之上运行,因此,JMX 使用了 2 个端口:

  • JMX 连接端口。 ( -Dcom.sun.management.jmxremote.port
  • (声名狼藉的)漫游 RMI 数据端口。 ( -Dcom.sun.management.jmxremote.rmi.port )

RMI 数据端口将打开一个从 1099 开始的随机端口。通过将 RMI 注册表和 RMI 服务器使用的端口设置为相同的端口,隧道连接将变得更加容易。

所以我需要添加 -Dcom.sun.management.jmxremote.rmi.port=9010 到 JVM 选项

我需要使用以下 JVM 选项:

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

阅读更多:

原文由 thangdc94 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题