如何使用 jps+jstatd 访问远程服务器上的jvm进程

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. 本地连接测试