怎么运用JMX远程监控,管理JVM

怎么运用JMX远程监控,管理JVM,第1张

如果你跑的就是一个简单的Java程序:

1、假如跑在本地,只需要在运行程序是加上 -Dcom.sun.management.jmxremote

2、假如跑在远程,则要加上-Dcom.sun.management.jmxremote.port=9999

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=true

-----当然你还可以加其它配置,譬如用户名和密码-------

假设你的程序跑在容器(譬如说你提到的tomcat),那么一定有个配置文件会让你加上以上的这些配置,对tomcat来讲,就是

CATALINA_HOME/bin目录下的catalina.bat 或catalina.sh,在JAVA_OPTS那行中加上以上第二点的配置

简单来讲,加上这些配置,你的程序就可以使用JMX来监控,即你的程序向外部暴露了JMX接口。

如何配置visualvm监控

visualvm支持在Linux和windows上启用图形界面监控jvm的资源,但是如何可以使我们在windows上监控到远程linux服务器资源,这还需要做一些配置,此文是在原文基础上做了更改的,希望对大家能有所帮助。

(1)首先要修改JDK中JMX服务的配置文件,以获得相应的权限:

进入$JAVA_HOME所在的根目录的/jre/lib/management子目录下,

a. 将jmxremote.password.template文件复制为jmxremote.password

b. 调整jmxremote.access和jmxremote.password的权限为只读写,可以使用如下命令

chmod 600 jmxremote.access jmxremote.password

c. 打开jmxremote.password文件,去掉

# monitorRole QED

# controlRole R&D

这两行前面的注释符号

(2)修改env.sh

打开env.sh文件,并在JVM的启动配置中添加如下信息:

JAVA_OPTS="-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.20.150.218 其他配置”

这几个配置的说明如下:

-Dcom.sun.management.jmxremote.port:这个是配置远程connection的端口号的,要确定这个端口没有被占用

-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false:这两个是固定配置,是JMX的远程服务权限的

-Djava.rmi.server.hostname:这个是配置server的IP的,要使用server的IP最好在机器上先用hostname –i看一下IP是不是机器本身的IP,如果是127.0.0.1的话要改一下,否则远程的时候连不上,目前我们的server上我已经都改好了

(3)Windows客户端配置

JDK 1.6版本自带visualvm,只需要进到bin目录下启动即可

启动后页面比较简洁,配置也很简单:

a. 点击左侧菜单的add Remote host,输入server的IP,然后再advanced settings里配置端口(注意这个端口要和server上的端口一致)

b. 右击刚才配置的IP,选择JMX connection方式,再次输入端口,就可以监视到JVM资源了

目标: 使用JDK自带的JVM监测工具调试内存使用情况及堆栈问题排查

简要说明: 在实际项目开发过程中,如果使用多线程,但是没有控制好线程数量的情况下,就会出现堆内存溢出问题,导致功能服务宕机,如果严重很可能导致服务器宕机问题。当出现内存溢出时,只能看到简单的内存溢出日志,排查问题毫无头绪,不知道哪里线程出现问题,这样就很难解决问题;

这时我们就可以通过JDK自带的JVM监控工具查看每个线程的生命周期以及相关源码追溯,这样就可以清楚明了的看清问题出现在哪里,然后根据实际情况解决问题;

通过上图可以看到本地服务中所有的线程及相关状态,如果线程出现问题需要排查时,需要查看具体执行的方法,那么就需要快照方式查看,具体方式如下:

点击抽样器,然后选择CPU抽样,点击停止,在点击下面的快照按钮,就可以获取所有所有线程的一次快照,然后就可以看到每个线程执行的源码,具体 *** 作如下图:

通过上述的 *** 作即可查看线程具体涉及的源码,从而排查问题!

上面说的是本地服务监测,但是有很多情况本地服务是排查不到问题的,只有在服务器上面才能看出问题,那么我们就需要远程连接服务器上面服务,进行监控,查看具体线程的运行情况及源码分析

远程配置需要在启动Java服务的时候,在启动命令上面添加指定启动参数,这里提供的命令是正常情况下完整的启动jar包的命令,具体命令参数也很清楚,命令如下:

ps:port是监控所需的端口,也就是启动服务指定的端口,但是端口要对外开放,一般的普通服务端口是不会对完开放的,这一点需要注意

hostname是对应监控的ip,我这里用的就是服务器ip,如果连接不上的情况下,可以尝试使用 hostname -i 获取的对应ip,具体情况具体分析

然后启动服务之后,选中远程右键添加远程主机,输入远程主机ip后确定即可,然后选择主机ip,右键添加JMX连接,输入设定的端口号,点击确定即可,然后就可以监控远程服务器了,接下来的查看线程的情况、监控服务情况及排查问题使用快照,就和上面本地的 *** 作一样了!

经过上述 *** 作就可以通过JDK自带的监控软件,进行监控Java程序的运行情况以及服务器的运行情况啦!

本人原著,如有问题欢迎大家指正,共同进步!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7914780.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存