VisualVM通過密碼JMX遠程連接JVM


 

如果本地安裝了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
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM