jvisualVm是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
远程服务器上的JVM监控就需要一些额外的配置。目前VisualVM支持两种监控方法:Jstatd方法和基于JMX的方法。
当前本人尝试及要说明的是Jstatd方法
jstatd是一个rmi的server应用,用于监控jvm的创建和结束,并且提供接口让监控工具可以远程连接到本机的jvm 。jstatd位于 $JAVA_HOME/bin目录下,具体使用方法如下:
环境
本地:windows10jdk1.8.0_221
远端:华为云服务器CentOS 6.10java-1.8.0-openjdk.x86_64
1、被监控机器启动RMI服务
1.1在远程机器上添加权限策略文件
在服务器{JAVA_HOME}/bin目录建立文件:jstatd.all.policy,文件内容:
grant codebase “file:${java.home}/…/lib/tools.jar” {
permission java.security.AllPermission;
};
此处也可以写绝对路径,防止路径错误问题,不过为了便于排查问题,应该写成相对路径。
linux指令 which java 可以查看当前机器JAVA_HOME路径
1.2 检查服务器hosts文件中的IP地址
使用hostname-i命令查看,如果显示的是127.0.0.1或者与本机实际IP不一致的话,服务器端应该在/etc/hosts文件中把本机地址设为本机的IP地址
其中192.168.0.47为私有内网ip
修改保存后执行 /etc/init.d/network restart 命令生效
1.3 启动远程机器jstatd
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=139.9.177.213 -J-Djava.rmi.server.logCalls=true
其中
-J-Djava.rmi.server.hostname=139.9.177.213为弹性公网ip
-J-Djava.rmi.server.logCalls=true 启动RMI日志功能便于查找问题
默认端口为1099,当1099端口被占用时 加-p 参数自己制定jstatd的端口
指令 netstat-ano|grep-i1099 查看1099端口是否被占用
在生产环境的配置如下(去掉日志打印,加入后台运行): jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=139.9.177.213 &
在启动jstat的时候,系统会随机分配一个端口,该端口也要在防火墙配置。可以看到除了1099外,还有个40427的端口,所以该端口也要加入防火墙中(这个随机端口重启后会变化)
iptables -I INPUT -p tcp --dport 40427 -j ACCEPT
重启防火墙 service iptables restart
当然云服务器还得配置安全组放开40427端口
本地用jps139.9.177.213可以看到远程java进程则说明成功
2、启动客户端的VisualVM,添加远程主机
VisualVM 在/java_home/bin目录下
存在问题 随机端口会变动,后续补充