在網上查詢了很多方法基本都是相同的操作但是對於我來說並不起作用,以下內容有參考 stack overflow
參考連結:
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中指定
即可成功執行。但是到這裡你也許會注意到-Djava.rmi.server.hostname
引數直接指定的IP而不是域名也是OK的
總結
- 缺少
-Dcom.sun.management.jmxremote.rmi.port
引數 -Djava.rmi.server.hostname
可以直接指定真實IP- java 一直在前進,知識要不斷更新