JMX 远程连接
目录
JMX 远程连接
1. 检查 Java 进程是否正确监听 JMX 端口
运行以下命令,确认 Java 进程是否在监听你配置的 ${process_port}:
sudo netstat -tulnp | grep java
预期输出(假设 ${process_port}=9010):
tcp6 0 0 :::9010 :::* LISTEN 12345/java
- 如果没有输出,说明 JMX 端口未正确绑定,检查启动参数是否生效。
- 如果端口是
127.0.0.1:9010而不是:::9010,说明 JMX 仅绑定到本地,需修改为0.0.0.0。
2. 确保 JMX 远程配置完整
JMX 远程访问需要 完整的 JVM 参数,仅配置端口是不够的。以下是 必须的 JMX 远程参数:
-Dcom.sun.management.jmxremote.port=${process_port} # JMX主端口
-Dcom.sun.management.jmxremote.rmi.port=${process_rmi_port} # 固定RMI随机端口,如果有防火墙控制的话,随机到防火墙控制的端口就连接不上了
-Dcom.sun.management.jmxremote.authenticate=false # 禁用认证(测试用)
-Dcom.sun.management.jmxremote.ssl=false # 禁用 SSL(测试用)
-Dcom.sun.management.jmxremote.local.only=false # 允许远程连接
-Djava.rmi.server.hostname=<服务器公网IP或内网IP> # 关键!避免 RMI 回环问题
关键点:
java.rmi.server.hostname必须设置为 服务器真实 IP(不能是127.0.0.1或localhost),否则 JMC 无法连接。- MX 实际使用 两个端口:
- JMX 主端口(上面的process_port):用于 JConsole 初始连接。
- RMI 随机端口(上面的process_rmi_port):用于数据传输(默认动态分配,可能导致连接失败)。
- 生产环境建议启用认证和 SSL(此处禁用仅用于测试)。
3. 检查防火墙是否放行端口
即使 JMX 配置正确,防火墙可能阻止连接。检查并开放端口:
(1)检查 iptables/firewalld
# 查看 iptables 规则
sudo iptables -nL | grep ${process_port}
# 临时开放端口(如 9010)
sudo iptables -I INPUT -p tcp --dport 9010 -j ACCEPT
# 如果使用 firewalld
sudo firewall-cmd --add-port=9010/tcp --permanent
sudo firewall-cmd --reload
(2)云服务器安全组
如果是 云服务器(AWS/Aliyun/Tencent Cloud),需在 安全组规则 中放行 ${process_port}(如 9010)。
4. 使用 JConsole 或 JVisualVM 连接
JConsole

JVisualVm

5. 常见错误及解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
Connection refused |
端口未监听 / 防火墙阻止 | 检查 netstat 和 iptables |
Authentication failed |
JMX 认证未正确配置 | 禁用认证或配置 jmxremote.password |
SSL handshake failed |
SSL 配置冲突 | 设置 jmxremote.ssl=false |
| 连接后无数据 | java.rmi.server.hostname 错误 |
确保 IP 是服务器真实 IP |
| 仅本地能连,远程不能 | 绑定到 127.0.0.1 |
设置 jmxremote.local.only=false |
Timeout连接失败 |
RMI随机端口随机到防火墙频闭的端口了 | 设置jmxremote.rmi.port,固定RMI端口 |
总结
- 检查端口监听 →
netstat -tulnp | grep java - 完整 JMX 参数 → 特别是
java.rmi.server.hostname和jmxremote.rmi.port(防止随机到防火墙未放行的端口) - 防火墙/安全组 → 防火墙放行 JMX 端口 + RMI 端口。
- JConsole/JVisualVM → 使用正确 IP 和端口连接
浙公网安备 33010602011771号