如何在Ubuntu上将JMC(Java Mission Control)连接到远程JVM?

25

我可以在同一台系统上连接到JVM,但是我希望监视远程服务器。我该如何将本地的JMC连接到远程的JVM呢?

4个回答

57

所有内容都已在文档中描述:
1. 点击帮助->Java Mission Control 帮助。
2. 检查JVM浏览器帮助。

如需更详细的信息,请查看以下网址:
http://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html

首先,您需要在服务器上启用外部JMX代理。这可以通过向您想要连接到的服务器JVM的命令行标志中添加相关的com.sun.management.jmxremote来实现。这里有一个简单的系统属性集示例,它禁用了安全性和认证,因此永远不要在生产环境中像这样使用:

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

接下来您需要在JMC中创建自定义连接。点击JVM浏览器中的“创建自定义连接”按钮即可: 位置:创建自定义连接按钮

在即将出现的对话框中,只需输入主机名和端口号即可。

如果遇到问题,请先查看随JMC提供的文档的上一章(常见问题解答): 帮助位置

如果这不起作用,则可以在JMC论坛上找到更多详细的常见问题解答:https://community.oracle.com/message/11182417#11182417


2
顺便提一下,如果连接仍未建立,请尝试添加以下Java系统属性:-Djava.rmi.server.hostname=<ip> - Saad Malik
是的。在附带的文档中(最后一章-常见问题)列出了尝试的事项之一。我应该也在论坛中链接到常见问题解答: https://community.oracle.com/message/11182417#11182417我会将其添加到我的回答中。 - Hirt
3
在SSH隧道的情况下,需要使用-Djava.rmi.server.hostname=localhost-Dcom.sun.management.jmxremote.rmi.port=[...]来让客户端通过已知端口而不是随机端口访问远程RMI对象。 - Thorsten Schöning
这里有一篇不错的文章,讲解了如何进行SSH隧道。http://issamben.com/how-to-monitor-remote-jvm-over-ssh/。由于我无法直接连接到远程进程,所以这对我很有用。 - alex

12

我的环境是在Linux中使用jboss 7.1,一开始尝试将JMC连接到我的jboss实例时出现了连接被拒绝的问题。经过一天半的挖掘,远程JMC现在可以正常运行了,在standalone.conf文件中添加以下配置即可:

JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman,org.jboss.logmanager"

JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS"


JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager"

JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:/apps/jboss-as-7.1.1.Final/modules/org/jboss/logmanager/main/jboss-logmanager-1.2.2.GA.jar"
JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:/apps/jboss-as-7.1.1.Final/modules/org/jboss/logmanager/log4j/main/jboss-logmanager-log4j-1.0.0.GA.jar"
JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:/apps/jboss-as-7.1.1.Final/modules/org/apache/log4j/main/log4j-1.2.16.jar"

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote=true"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=7091"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=7091"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"

JAVA_OPTS="$JAVA_OPTS -XX:+UnlockCommercialFeatures"
JAVA_OPTS="$JAVA_OPTS -XX:+FlightRecorder"

5
我想特别强调-Dcom.sun.management.jmxremote.rmi.port=[...]这个参数,因为在使用防火墙、SSH隧道等情况下会需要它。如果没有这个参数,RMI会使用随机端口提供远程对象,客户端需要访问这些对象。-Djava.rmi.server.hostname=[...]可能也是必需的。 - Thorsten Schöning

2

在使用以下标志运行目标JVM后,我能够在VirtualBox中看到一个JVM(宿主机:Win10,客户机:Ubuntu 20.04):

java -XX:+FlightRecorder \
-Dcom.sun.management.jmxremote.port=1101 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
MyApp

-8
在服务器 {Ubuntu} 上编辑 /etc/hosts 文件。
127.0.1.1       server-name

用这行代码替换上面的代码

<system-ip>     server-name

7
Hirt提供的另一个答案更有用。 - Aditya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接