內容html
筆者在阿里雲服務器中配置Java項目的JMX遠程鏈接,在確認JVM參數、防火牆、阿里雲安全組設置都無誤後,使用JConsole等工具鏈接JVM時仍出現JMX鏈接失敗的問題。筆者將該問題的解決方法記錄成文,供網友遇到一樣問題時能快速的處理。java
版本安全
操做系統: CentOS 7.2 64位服務器
JDK:1.8.0_181oracle
說明tcp
轉載請說明出處:Linux入門實踐筆記(七)——雲服務器中配置Java項目的JMX鏈接失敗問題解決記錄ide
JMX鏈接的官方文檔:https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html工具
做爲一名Java開發人員,大多數狀況下,只要確保寫好的代碼功能能跑通便可,不多關注代碼對CPU、內存、線程的資源依賴狀況。可是若是出現了Out-Of-Memory等問題,或想監控Java項目的運行情況(好比在進行壓力測試時),可使用JMX客戶端監控JVM的資源使用狀況。經常使用的JMX客戶端有JConsole、JMC、JVisualVM,這些都是JDK自帶的工具。post
在啓動jar包時添加com.sun.management.jmxremote.* 相關的JVM參數,該示例以7199爲JMX遠程監控的端口,不使用SSL安全鏈接,不啓用帳號密碼認證:測試
[user@ServerA2 jars]$ java -Dcom.sun.management.jmxremote.port=7199 #供JMX客戶端遠程鏈接用的端口號
-Dcom.sun.management.jmxremote.authenticate=false #關閉帳號密碼認證,不安全,僅在開發階段使用
-Dcom.sun.management.jmxremote.ssl=false #關閉SSL
-Djava.rmi.server.hostname=106.117.142.x #指定本機供遠程訪問的IP地址,此處是本機的公網IP
-Xms512m -Xmx512m -jar zuul-1.0-SNAPSHOT.jar &
其中-Djava.rmi.server.hostname參數必定要設置,不然鏈接失敗。
正確地配置了JVM參數後啓動jar包,在本地仍然沒法使用JMX Client訪問雲服務器上的JVM。筆者在阿里雲提交了工單,通過長達兩天時間屢次溝通後終於得知JMX鏈接失敗的緣由。
開啓JMX遠程監控管理功能後,JVM不只會佔用指定的com.sun.management.jmxremote.port配置的端口號7199,還會額外再開啓兩個隨機的端口號用於通訊。若是這兩個隨機的端口號沒有開放訪問,那麼遠程JVM Client仍是沒法鏈接到JVM的。
執行netstat -nltp
命令能夠查看JVM進程監聽的端口,本示例中啓動的java進程的PID爲15703,經過下面的查詢可知須要額外放行的兩個端口爲41264和41665。
[user1@ServerA2 jars]$ netstat -nltp #其中:-n表示表示輸出中不顯示主機,端口和用戶名,-lb表示只顯示監聽listening端口,-t表示只顯示tcp協議的端口,-p表示顯示進程的PID和進程名稱。
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:41264 0.0.0.0:* LISTEN 15703/java tcp 0 0 0.0.0.0:8881 0.0.0.0:* LISTEN 15703/java tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 15074/java tcp 0 0 0.0.0.0:7101 0.0.0.0:* LISTEN 15074/java tcp 0 0 0.0.0.0:7199 0.0.0.0:* LISTEN 15703/java tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:41665 0.0.0.0:* LISTEN 15703/java tcp6 0 0 :::80 :::* LISTEN -
將這兩個端口號在安全組中放行後,遠程JMX Client就能夠正常訪問JVM,真坑。