使用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等情况。
JMX方式监控
这里使用Kafka举例,Kafka启动的时候指定开启的JMX端口9999
1
| $ JMX_PORT=9999 ./kafka-server-start.sh ../config/server.properties &
|
然后使用VisualVM工具监控Kafka,先安装MBeans插件
参考文章: