侧边栏壁纸
博主头像
惊羽博主等级

hi ,我是惊羽,前生物学逃兵,现系统工程沉迷者 . 贝壳签约工程师 , 曾被雇佣为 联拓数科 · 支付研发工程师 、京东 · 京东数科 · 研发工程师、中国移动 · 雄安产业研究院 · 业务中台技术负责人 .

  • 累计撰写 100 篇文章
  • 累计创建 14 个标签
  • 累计收到 9 条评论

jdk(5) - jvm远程监控

惊羽
2021-06-18 / 0 评论 / 0 点赞 / 161 阅读 / 2,382 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-06-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

一. 服务端-添加启动参数,开启远程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开放即可;

0
广告 广告

评论区