借助Java VisualVM工具可视化监控JVM

9 篇文章 0 订阅

使用Java VisualVM工具监控JVM

Java VisualVM是JDK自带的一个可视化的性能分析工具,集成了命令行JDK工具和轻量级概要分析功能。功能界面如图所示:截图一
从图中不难看出,他可以图形化的看到本地的java进程以及远程机器的java进程,分析他们的堆栈信息、线程运行信息、内存回收情况等信息,下面主要介绍怎么监控本机Java进程和远程服务器的Java进程。

首先,这个工具在$JAVA_HOME/bin目录下,当然你可以直接去他们的官网自行下载。

监控本机JVM

本机的java进程监控起来就很简单了,你双击运行这个软件就可以看到本地有哪些正在运行的java进程了,双击进去浏览一下就知道了,都是中文的,怎么使用就不一一赘述了。

监控远程服务器JVM

在实际工作中,需要在本机监控生产环境下的jvm,Visualvm目前支持两种远程连接方式

  • 通过jstad方式
  • 通过jmx方式

下面就主要介绍下这两种连接方式

通过jstad的方式

  1. 在java_home/bin目录添加文件jstatd.all.policy文件;
  2. 编辑文件,添加以下内容:
grant codebase "file:${java.home}/../lib/tools.jar" {
      permission java.security.AllPermission;
};
  1. 执行命令后台运行jstatd工具
./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=110.110.110.110 &
  1. 在本机的Java VisualVm中添加远程机器
  2. 右键“远程”,添加远程机器
    在这里插入图片描述
  3. 输入主机IP
    在这里插入图片描述
  4. 点击“确定”,就可以连接上了,之后的操作就和本机的监控是一样的了。连接后的左侧导航栏如图所示:
    在这里插入图片描述
  5. 使用jstatd的方式,会有些模块使用不了,比方说监控模块下的CPU监控就不受支持,并且线程的状态也无法监控。

通过jmx的方式

  1. 介绍JMX连接的方式前,要先介绍下下面几个参数
# 是否支持远程JMX访问,默认true
-Dcom.sun.management.jmxremote 
# 设置hostName
-Djava.rmi.server.hostname=主机IP地址or域名
# 暴露的监听端口(端口可以自定义,不要被占用了就好)
-Dcom.sun.management.jmxremote.port=10012 
# 是否开启SSL
-Dcom.sun.management.jmxremote.ssl=false 
# 是否需要身份认证,生产环境建议开启
-Dcom.sun.management.jmxremote.authenticate=false
  1. 要是用jmx连接也很简单,就是在运行java程序的时候,指定上述的参数,开启jmx的监听即可。下面一一个简单的spring-boot项目运行为例。启动命令由本来的
java -jar demo.jar

修改为

java -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=110.110.110.110 -Dcom.sun.management.jmxremote.port=10012 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar restful-demo.jar &

sprin-boot程序启动成功后,可以通过netstat -ntl |grep 10012查看下10012端口是否处于监听状态,如果端口没有开放出来,那么你就要仔细的检查下你的命令了。
PS: 开启jmx监听的这些配置参数需要紧跟在关键字java后面哦,-jar restful-demo.jar是放在虚拟机参数后面的,否则就真的开启不了JMX监听,切记切记。
3. 在VisualVm中添加这个JMX连接
在这里插入图片描述
4. 输入监听的端口10012,由于我们没有开启身份认证,故这里只需要输入端口就可以了,无须输入下面的安全凭证信息
在这里插入图片描述
5. 点击“确定”即可连接上了,添加成功后的左侧导航栏如下所示:
在这里插入图片描述
6. 连接上后的操作就可以本地的一致了,不再赘述。不过使用JMX方式连接的话,所有功能模块均可以使用,比jstatd的方式要强大一些。

使用身份认证JMX连接

细心的你肯定发现了,上面的SSL、Authentication都是false,都禁用掉了,如果是特殊的环境需要做安全验证,怎么配置JMX连接呢?下面就为你介绍带身份验证的JMX连接方式。

  1. 开启JMX连接的身份认证很简单,只需要把上面的-Dcom.sun.management.jmxremote.authenticate=false属性值修改为true即可开启身份认证。
  2. 那么是不是直接改个属性就可以了呢?既然开启了身份认证,总的有个地方让我配置用户名密码吧,是的,肯定有给你提供配置用户名密码的地方。但是我们先不配置用户名密码试下,小编先帮你踩一遍坑,让你知道碰到这个错误是什么引起的。
[csbapp@soa11g ~]$ java -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=110.110.110.110 -Dcom.sun.management.jmxremote.port=10012 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -jar restful-demo.jar &
[2] 25253
[csbapp@soa11g ~]$ Error: Password file not found: /apps/lightesb_new/JDK/jdk1.8.0_212/jre/lib/management/jmxremote.password
sun.management.AgentConfigurationError
	at sun.management.jmxremote.ConnectorBootstrap.checkPasswordFile(ConnectorBootstrap.java:563)
	at sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:426)
	at sun.management.Agent.startAgent(Agent.java:262)
	at sun.management.Agent.startAgent(Agent.java:452)

错误也描述的很清楚Password file not found,并且还指出了password文件路径,很明显这个文件的路径就是我们$JAVA_HOME/jre/lib/management下,那我们去这个目录下看下

[csbapp@soa11g ~]$ cd /apps/lightesb_new/JDK/jdk1.8.0_212/jre/lib/management/
[csbapp@soa11g management]$ ll
total 28
-rw-r--r-- 1 csbapp oinstall  3998 Apr  2  2019 jmxremote.access
-r--r--r-- 1 csbapp oinstall  2856 Apr  2  2019 jmxremote.password.template
-rw-r--r-- 1 csbapp oinstall 14630 Apr  2  2019 management.properties
-r--r--r-- 1 csbapp oinstall  3376 Apr  2  2019 snmp.acl.template
  1. 很明显,jdk给我们准备了一个jmxremote.password.template的模板文件,我们先copy一份出来,把后缀template去掉,至于为什么,你仔细留意下上一步我的错误信息,说密码文件没有找到,提示的路径可不仅仅是个路径而已,还带了文件名的哦。下面就是修改这个jmxremote.password文件了,整个文件都是被注释掉的,介绍你可以浏览下,最后的两行就是配置用户名密码的地方,但是这里的用户名注意下哦,用户名密码都是支持自定义的,但是你这里自定义的用户名要在同级目录下的jmxremote.access中有配置才行,这个文件里面维护了用户的权限。 这里配置好后,我们再重启下spring-boot的项目,再来试试,这个时候依然会报错,如下所示:
[csbapp@soa11g ~]$ java -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.204.105.134 -Dcom.sun.management.jmxremote.port=10012 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -jar restful-demo.jar &
[2] 25333
[csbapp@soa11g ~]$ Error: Password file read access must be restricted: /apps/lightesb_new/JDK/jdk1.8.0_212/jre/lib/management/jmxremote.password
sun.management.AgentConfigurationError
	at sun.management.jmxremote.ConnectorBootstrap.checkPasswordFile(ConnectorBootstrap.java:577)
	at sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:426)
	at sun.management.Agent.startAgent(Agent.java:262)
	at sun.management.Agent.startAgent(Agent.java:452)

Password file read access must be restricted,这个错误是说jmxremote.password文件没有读的权限,用命令chmod 600 jmxremote.password给密码文件加上权限即可,再次重启就可以正常启动了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值