使用visualvm和JMX进行远程监控

use*_*468 18 java monitoring jmx spring-boot

我想用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
Run Code Online (Sandbox Code Playgroud)

然后我按如下方式启动程序(这是针对spring xd,但我遇到了与其他java程序相同的问题).

$ bin/xd/xd-singlenode
Run Code Online (Sandbox Code Playgroud)

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

$ 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 (...)
Run Code Online (Sandbox Code Playgroud)

远程主机(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)
Run Code Online (Sandbox Code Playgroud)

本地计算机(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)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

这是jvisualvm给我的错误消息:

jvisualvm给出的错误消息

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

任何帮助都非常感谢.

Arn*_*was 27

请使用以下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
Run Code Online (Sandbox Code Playgroud)

在Jconsole中使用以下连接:

service:jmx:rmi:///jndi/rmi://192.168.59.99:9010/jmxrmi
Run Code Online (Sandbox Code Playgroud)

  • @JackZach在企业防火墙内部非常常见 (9认同)

tha*_*c94 21

Arnab Biswas 的 anwser 在我的情况下不起作用。经过一个小时的研究,我发现 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
Run Code Online (Sandbox Code Playgroud)

阅读更多:

  • 谢谢 !!!!我慢慢地疯狂地尝试远程连接到工作的防火墙主机......恕我直言,这应该是公认的答案。似乎几乎没有人尝试连接到位于防火墙后面的计算机,因此他们都只是建议设置“com.sun.management.jmxremote.port”,但没有人提到“com.sun.management.jmxremote.rmi.port”.. 。 (2认同)