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

 

posted @ 2019-06-01 18:48  大坑水滴  阅读(2267)  评论(0编辑  收藏  举报