一. 服务端-添加启动参数,开启远程jmx服务
java允许在启动时添加参数指定jvisual的启动监听配置
java -Djava.rmi.server.hostname=47.xx.xx.xx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar www.jar
其中:
-Djava.rmi.server.hostname=47.xx.xx.xx
// 代表rmi服务的ip,一般为本机的公网ip;
// 注意 : 要使Java VisualVM 成功连接到远程服务器上,服务器端应该在 /etc/hosts 文件中把本机地址设为本机的 IP 地址。使用 hostname -i 命令查看,如果显示的是 127.0.0.1 或者与本机实际 IP(阿里云的话,hostname -i 显示内网IP也可以) 不一致的话,需要把 /etc/hosts 文件中相应的地址改为本机实际 IP 。
-Dcom.sun.management.jmxremote
// 代表开启远程jmx服务配置
-Dcom.sun.management.jmxremote.port=1099
// 代表远程jmx服务监听的端口
-Dcom.sun.management.jmxremote.authenticate=false
// 代表远程监控认证开关(本文为关,不开启验证,生产环需要配置,具体可搜索相关文章)
-Dcom.sun.management.jmxremote.ssl=false
// 代表远程连接的ssl认证开关(本文为关,不开启验证,生产环需要配置,具体可搜索相关文章)
我们在发布springboot项目的jar包时,一般都是nohup的后台启动方式,在撰写脚本时,如果你觉得启动参数太长,影响脚本的阅读性,我们也可以设置环境变量,然后再脚本里直接使用环境变量启动即可;
修改环境变量 :
使用命令 : vim /etc/profile
在末尾添加如下参数(hostname=47.xx.xx.xx 必须换成自己服务器ip) :
export JAVA_OPTS='-Djava.rmi.server.hostname=47.xx.xx.xx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false'
使用命令 : source /etc/profile
使环境变量配置文件生效;
修改启动脚本:
# 启动
function start(){
# 日志文件夹不存在,则创建
# if [ ! -d "${log_dir}" ];then
# mkdir "${log_dir}"
# fi
rm -f tpid
nohup java $JAVA_OPTS -jar ${APP_NAME} 1>/dev/null &
echo $! > tpid
check
}
nohup java $JAVA_OPTS -jar $ 1>/dev/null & echo $! > tpid
加入了$JAVA_OPTS参数;
启动项目后,
使用命令 : jps -m -l
校验一下, 看环境变量生效没有.
二. 服务端-防火墙相关端口开放,客户端-启动jvisualVM应用,连接远程监控
由于配置jmx服务设置了jmx的监听端口为1099, 我们需要在iptables等防火墙设置中,对特定的用户开放端口,这样我们才能远程连接上.
本文使用阿里云,只需要在安全组中将1099端口配置给指定ip开放即可;
此时,我们可以在客户端尝试连接 :
jvisualvm添加远程主机
双击启动 jdk/bin/jvisualvm.exe 应用,右键远程--添加远程主机--填写远程主机名--确定
添加jmx监控
在新添加的远程主机上右键--添加新的jmx连接
填写我们的远程主机IP:端口--确定
这样我们就能实时监控远程jvm的情况了
可能出现的异常
添加远程主机后,新建jmx连接时,可能会报错 :
VisualVM 使用 service:jmx:rmi:///...无法连接linux远程服务器
这是因为, jmx启动后,处监听我们制定的主端口(1099)外,还需监听另外两个随机端口,我们可以使用命令查看 :
找到进程号
使用命令 : jps -m -l
找到我们的jar项目进程号 23882
找到子进程监听随机端口号
使用命令 : netstat -tupln |grep 23882
在防火墙将图中的两个随机端口号(43774 , 44739)为我们检测客户端pc的IP开放即可;
评论区