1. 问题来源
jps
可以打印出所有的 JVM 进程,也可以通过jps hostid
访问远程节点上的 JVM进程,但需要远程节点注册相关的服务,并且开放相关端口才允许其他节点访问
2. jstatd 简介
jstatd工具是一个RMI服务器应用程序,主要用于监控HotSpot Java 虚拟机的创建与终止,并提供一个接口以允许远程监控工具附加到本地主机上运行的JVM上。
jstatd服务器需要在本地主机上存在一个RMI注册表。jstatd服务器将尝试在默认端口或-p port选项指定的端口附加到该RMI注册表上。如果RMI注册表不存在,jstatd应用程序将会自动创建一个,并绑定到-p port选项指定的端口上,如果省略了-p port选项,则绑定到默认的RMI注册表端口。你可以通过指定-nr选项来抑制内部RMI注册表的创建。
3. 创建 jstatd.all.policy 文件
grant codebase "file:/usr/lib/jvm/java-8-oracle/lib/tools.jar"{
permission java.security.AllPermission;
};
其中file: 后面是 安装的 jdk 所在路径
4. 修改服务器 hosts 文件中的 IP 地址
服务器端应该在 /etc/hosts 文件中把本机地址设为本机的 IP 地址。使用 hostname -i 命令查看,如果显示的是 127.0.0.1 或者与本机实际 IP 不一致的话,需要把 /etc/hosts 文件中相应的地址改为本机实际 IP 。
例如输入
$hostname -i
127.0.1.1
打开 /etc/hosts 文件,找到 127.0.1.1 这一行,将 127.0.1.1 改为本机 ip(通过 ip addr 获取)
5. 启动 jstatd
screen jstatd -J-Djava.security.policy=jstatd.all.policy
如果没有安装 screen , 请自行安装
执行结束按 ctrl+A+D
6. 开放相关的端口号
如果 jstatd 命令没有用 -p port 指定端口号的话,默认占用的是 1099 端口,除了该端口,还会占用一个随机端口
ethan@ubuntu:~/code$ netstat -nap | grep jstatd
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 :::1099 :::* LISTEN 3452/jstatd
tcp6 0 0 :::34703 :::* LISTEN 3452/jstatd
unix 2 [ ] STREAM CONNECTED 35371 3452/jstatd
得到另一个随机端口号为 34703, 防火墙开放 1099 和 34703
sudo ufw 1099
sudo ufw 34703
7. 本地连接测试
C:\Users\lenovo>jps -l rmi://192.168.2.128
4056 BusyThread
3452 sun.tools.jstatd.Jstatd
如果远程节点jstatd 不是 1099 节点,则 ip 后需要加上端口号,例jps -l rmi://192.168.2.128:12345