jvisualVm监控远程的jvm

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目录下

存在问题 随机端口会变动,后续补充

猜你喜欢

转载自blog.csdn.net/m0_54853503/article/details/124275658