如何在JVM上激活JMX以使用jconsole进行访问?
当前回答
在Docker容器中运行会带来一系列额外的连接问题,希望这能帮助到一些人。我最终需要添加以下选项,我将在下面解释:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${DOCKER_HOST_IP}
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
DOCKER_HOST_IP
与在本地使用jconsole不同,您必须通告一个不同的IP,而不是在容器中可能看到的IP。您需要将${DOCKER_HOST_IP}替换为Docker主机的外部可解析IP (DNS Name)。
JMX远程和RMI端口
看起来JMX还需要访问远程管理接口(jstat),该接口在仲裁连接时使用不同的端口传输一些数据。我在jconsole中没有看到任何地方明显需要设置这个值。在链接的文章中,过程是:
尝试在启用日志记录的情况下从jconsole连接 失败 找出jconsole试图使用的端口 根据需要使用iptables/防火墙规则来允许该端口连接
虽然这是可行的,但它肯定不是一个可自动化的解决方案。我选择从jconsole升级到VisualVM,因为它允许您显式地指定运行jstatd的端口。在VisualVM中,添加一个新的远程主机,并使用与上面指定的值相关的值更新它:
然后右键单击新的远程主机连接并添加JMX连接…
不要忘记勾选“不需要SSL连接”复选框。希望这能让你们建立联系。
其他回答
连同下面的命令行参数,
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
在linux服务器上,有时imx连接不成功。这是因为,在云Linux主机中,在/etc/hosts中使主机名解析为主机地址。
修复它的最好方法是,从网络中的其他机器ping特定的linux服务器,并使用该主机IP地址
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
但是永远不要依赖于你从linux服务器上使用ifconfig.me获得的ipaddress。你得到的IP是掩码的,在主机文件中。
我有这个确切的问题,并创建了一个GitHub项目来测试和找出正确的设置。
它包含一个工作Dockerfile和支持脚本,以及一个简单的docker-compose。Yml快速测试。
以下选项适合我:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname={host name}
并且记得在服务器上打开9010端口
sudo ufw allow 9010/udp
sudo ufw allow 9010/tcp
sudo ufw reload
在Docker容器中运行会带来一系列额外的连接问题,希望这能帮助到一些人。我最终需要添加以下选项,我将在下面解释:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${DOCKER_HOST_IP}
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
DOCKER_HOST_IP
与在本地使用jconsole不同,您必须通告一个不同的IP,而不是在容器中可能看到的IP。您需要将${DOCKER_HOST_IP}替换为Docker主机的外部可解析IP (DNS Name)。
JMX远程和RMI端口
看起来JMX还需要访问远程管理接口(jstat),该接口在仲裁连接时使用不同的端口传输一些数据。我在jconsole中没有看到任何地方明显需要设置这个值。在链接的文章中,过程是:
尝试在启用日志记录的情况下从jconsole连接 失败 找出jconsole试图使用的端口 根据需要使用iptables/防火墙规则来允许该端口连接
虽然这是可行的,但它肯定不是一个可自动化的解决方案。我选择从jconsole升级到VisualVM,因为它允许您显式地指定运行jstatd的端口。在VisualVM中,添加一个新的远程主机,并使用与上面指定的值相关的值更新它:
然后右键单击新的远程主机连接并添加JMX连接…
不要忘记勾选“不需要SSL连接”复选框。希望这能让你们建立联系。
步骤1:使用以下参数运行应用程序。
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
上述参数将应用程序绑定到端口9999。
步骤2:在命令提示符或终端中执行命令jconsole来启动jconsole。
选择“远程进程:”并输入url为{IP_Address}:9999,然后单击连接按钮连接到远程应用程序。
您可以参考此链接以获得完整的应用程序。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap