如果本地安裝了JDK,則在${java.home}/bin/下可找到jvisualvm.exe,雙擊打開即可使用。否則,去官網下載一個,解壓即可使用。現有一個springboot程序springbootdemo.jar,使用JDK中jvisualvm的JMX方式監控該JVM
一、查詢hostname
二、檢查hostname對應ip地址
下面是新裝虛擬機hostname對應ip地址
三、查詢當前機器供外網訪問的ip地址
本機ip地址為192.168.102.31
四、將hostname對應ip地址添加到/etc/hosts文件中
vim /etc/hosts
添加
192.168.102.31 localhost.localdomain
五、設置JMX連接用戶名密碼
1、進入到${jre.home}/lib/management下
cp -r jmxremote.password.template jmxremote.password
2、打開jmxremote.password,修改,添加用戶或密碼,建議不要使用默認的用戶名和密碼登錄
monitorRole 222 jmxuser 111111 newuser 222222
3、打開jmxremote.access,修改新加/修改的用戶權限
monitorRole readonly jmxuser readwrite \ create javax.management.monitor.*,javax.management.timer.* \ unregister newuser readwrite \ create javax.management.monitor.*,javax.management.timer.* \ unregister
4、設置權限
chmod 0400 jmxremote.password
如果不設置權限,可能出現如下異常
Password file read access must be restricted: /usr/java/jdk1.8.0_162/jre/lib/management/jmxremote.password
六、啟動springboot程序
springbootdemo啟動腳本如下,JMX server主監聽端口號設置為1566
#!/bin/bash cd `dirname $0` /usr/java/jdk1.8.0_162/bin/java -jar -Djava.rmi.server.hostname=192.168.102.31 -Dcom.sun.management.jmxremote.port=1566 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Xms100m -Xmx100m springbootdemo.jar &
七、開放端口
如果防火牆處於關閉狀態,則這一步跳過,否則按照如下步驟操作
1、查詢當前進程pid
ps -ef | grep springbootdemo
2、查詢該java程序監聽的端口
lsof -i | grep 38231
3、在防火牆中打開所需端口(1566/44518/56989)
需要注意的是,除了JMX監聽端口號1566是固定之外,每次啟動,另外兩個監聽端口號都會發生變化,可以使用腳本在啟動后獲取到另外兩個端口,添加到防火牆中,並且移除上一次啟動時監聽的隨機端口
firewall-cmd --permanent --add-port=1566/tcp firewall-cmd --permanent --add-port=44518/tcp firewall-cmd --permanent --add-port=56989/tcp
4、重啟防火牆使之生效
systemctl restart firewalld.service
5、查看端口開放結果,確認設置成功
firewall-cmd --list-all
八、VisualVM連接該JVM
1、VisualVM打開后,右鍵遠程 -- 》添加運城主機,輸入ip地址,確定
2、在剛添加的主機上,右鍵選擇添加JMX連接,輸入端口號
點擊確定,安全憑證彈出框中輸入用戶名密碼
點擊確定,會提示無法以SSL方式,連接到XXX,用戶名和密碼將以純文本發送,這個先不管,后續再通過ssl連接,點擊是,可以發現在左側主機下多出一列
雙擊打開
配置結束
附:防火牆出於開啟狀態時,在firewall中自動開放監聽端口

#!/bin/bash cd `dirname $0` java -jar -Djava.rmi.server.hostname=192.168.102.31 -Dcom.sun.management.jmxremote.port=1566 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xms100m -Xmx100m springbootdemo.jar & declare -a arr firewall-cmd --permanent --add-port=1566/tcp runflag="`systemctl status firewalld | grep running`" if [ "$runflag" != "" ];then if [ -f ./random_listen_port_file ];then for old_random_listen_port in `cat ./random_listen_port_file`;do firewall-cmd --permanent --remove-port=$old_random_listen_port/tcp done rm -rf ./random_listen_port_file fi ## firewall is running pid="`ps -ef | grep springbootdemo.jar | grep -v grep | awk '{print $2}'`" if [ "$pid" != "" ];then while true;do arr=`lsof -i | grep $pid | grep LISTEN |awk '{print $9}' | cut -d ':' -f2` len=`lsof -i | grep $pid | grep LISTEN |awk '{print $9}' | cut -d ':' -f2 | wc -l` if [ "$len" != "3" ];then sleep 1s else break fi done ## program is running for random_listen_port in $arr;do echo $random_listen_port | grep -q '[^0-9]' if [ $? -eq 1 ];then echo $random_listen_port >> ./random_listen_port_file firewall-cmd --permanent --add-port=$random_listen_port/tcp fi done fi systemctl restart firewalld.service fi