我可以在同一台系统上连接到JVM,但是我希望监视远程服务器。我该如何将本地的JMC连接到远程的JVM呢?
所有内容都已在文档中描述:
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。
我的环境是在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"
-Dcom.sun.management.jmxremote.rmi.port=[...]
这个参数,因为在使用防火墙、SSH隧道等情况下会需要它。如果没有这个参数,RMI会使用随机端口提供远程对象,客户端需要访问这些对象。-Djava.rmi.server.hostname=[...]
可能也是必需的。 - Thorsten Schöning在使用以下标志运行目标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
/etc/hosts
文件。127.0.1.1 server-name
用这行代码替换上面的代码
<system-ip> server-name
-Djava.rmi.server.hostname=<ip>
。 - Saad Malik-Djava.rmi.server.hostname=localhost
和-Dcom.sun.management.jmxremote.rmi.port=[...]
来让客户端通过已知端口而不是随机端口访问远程RMI对象。 - Thorsten Schöning