遠端監控Springboot JVM

SimpleC發表於2018-12-15

在網上查詢了很多方法基本都是相同的操作但是對於我來說並不起作用,以下內容有參考 stack overflow

參考連結:

Remote JMX connection

Why Java opens 3 ports when JMX is configured?

環境:
JDK 1.8
springboot 1.5.x 版本
centos7
複製程式碼

在網上查詢的例子中指定的引數

java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=<IP> -jar example.jar\ 
複製程式碼

用以上引數執行時我有檢查 -Dcom.sun.management.jmxremote.port 指定的埠是否開放以及本機能夠telnet成功,但是使用vidualVM 和 Jconsole 連結時總是失敗提示:

[root@xxx home]# netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp6       0      0 :::1099                 :::*                    LISTEN      26231/java          
tcp6       0      0 :::8080                 :::*                    LISTEN      26231/java 
複製程式碼

失敗圖片
被馬賽克塗掉的地方是我的伺服器的外網IP,看著提示的錯誤像伺服器開啟了SSL認證但是我的引數中明明給關閉掉了,後來又折騰了一會。在stack overflow中找到了答案。除了上面的引數以外還需要檢視本機的IP

[root@xxx home]# hostname -i
fe80::216:3exxxxxxx%eth0 172.xx.xx.xx
複製程式碼

在hosts 檔案中新增一個對映,但是我加上對映之後仍然不能使用

172.xx.xx.xx example.com
然後將引數改為
-Djava.rmi.server.hostname=example.com
複製程式碼

繼續找。。。看到有人說需要新增 -Dcom.sun.management.jmxremote.rmi.port=1099

最終的執行命令:

java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.rmi.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=<IP> -jar example.jar\ 
複製程式碼

visualVM中指定

visualVM

runtime
即可成功執行。

但是到這裡你也許會注意到-Djava.rmi.server.hostname引數直接指定的IP而不是域名也是OK的

總結

  • 缺少-Dcom.sun.management.jmxremote.rmi.port 引數
  • -Djava.rmi.server.hostname 可以直接指定真實IP
  • java 一直在前進,知識要不斷更新

相關文章