在 Windows 客戶端使用 JConsole 連接 Linux 伺服器上的 Java 進程時,常遭遇連線失敗、拋出 RMI 協議異常等問題。本文記錄一次真實排查歷程,從錯誤現象分析到根因定位,最終提供經驗證有效的解決方案。
jconsole 連接遠端 Java 服務,命令列持續拋出連線異常,網路通訊正常、8999 連接埠也在監聽,但即無法建立監控會話經查證 Sun Bug Database(Bug ID: 6209663),此為已知問題:Linux 主機 hostname -i 解析為 127.0.0.1,導致 RMI 服務將 Stub 綁定至回環介面,遠端客戶端下載 Stub 後嘗試連回 127.0.0.1 自然失敗。修改 hostname 指令無效,因核心解析仍指向回環。
-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false。實測會導致應用伺服器啟動失效,不推薦。127.0.0.1,證實 Stub 綁定錯誤。127.0.0.1 localhost.localdomain localhost 改為 192.168.1.234 localhost.localdomain localhost(真實 IP),重啟後 hostname -i 回傳正確位址,JConsole 即可正常連線。hostname -i 取得位址,若為回環則導致遠端無法回連。# 1. 編輯 hosts 檔案
vi /etc/hosts
# 將第一行 127.0.0.1 改為伺服器真實內網 IP
192.168.1.234 localhost.localdomain localhost
# 2. 重啟主機或重啟網路服務
reboot
# 3. 驗證
hostname -i # 應輸出 192.168.1.234
# 4. 啟動 Java 服務(加入 JMX 參數)
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=8999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar your-app.jar
# 5. Windows 端啟動 jconsole 連接 192.168.1.234:8999
127.0.0.1 對應的 localhost,會破壞本地服務;需新增一行真實 IP 對應 hostname/etc/hosts 對應的是客戶端可達的那張介面 IP採用 /etc/hosts 強制解析真實 IP 為最簡單、穩定且無副作用的方案,已在多個生產環境驗證有效。