JVM监控工具VisualVM

使用jstatd方式远程监控Linux下的JVM运行情况

在${JAVA_HOME}/bin目录下创建jstatd.all.policy安全策略文件

1
2
3
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};

jstatd 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
jstatd 命令
options
-nr : 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
-p : port 端口号,默认为1099
-n : rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
-J : jvm选项
$ cd $JAVA_HOME/bin
# 启动jstatd服务,使用内部RMI Registry默认端口号1099
$ ./jstatd -J-Djava.security.policy=jstatd.all.policy
# 注册一个RMI端口
$ rmiregistry 2020&
# 启动jstatd服务,指定安全策略文件,使用外部RMI Registry指定端口号2020
$ ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.100 -p 2020

若出现下面的问题,是因为没有给jstatd指定安全策略,如上新建安全策略文件后运行指定文件即可

1
2
3
4
5
6
7
8
Could not create remote object
access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.System.setProperty(System.java:725)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)
1
2
# 下载并启动VisualVM
$ ./visualvm --jdkhome $JAVA_HOME --userdir ~/

启动成功后,新建一个Remote Host(指定你要监控的主机IP地址),就可以看到对应的使用JVM的进程以及PID了,还可以查看具体进程的CPU,Heap,Threads等情况。

VisualVM

VisualVM_Monitor

JMX方式监控

这里使用Kafka举例,Kafka启动的时候指定开启的JMX端口9999

1
$ JMX_PORT=9999 ./kafka-server-start.sh ../config/server.properties &

然后使用VisualVM工具监控Kafka,先安装MBeans插件

  • 添加一个JMX连接

添加JMX连接

  • JMX连接的端口是我们前面启动使用的9999

JMX连接信息

  • MBean插件显示具体的监控信息

监控详情

参考文章: