1. jstatd功能
在远程服务端启动一个RMI server,允许本地通过jps
、jstat
命令行工具及jvisualvm
可视化工具监控远程服务器的Java进程。
1.1 命令参数
参数名 | 介绍 |
---|---|
-nr | 默认情况下如果没有发现RMI registry (注册中心),会在jstatd进程中创建一个,加-nr后会阻止其创建 |
-p | 指定RMI registry 端口,默认1099 |
-n | 指定RMI server 注册到RMI registry 的名称,通过名称区分不同的RMI server,默认JStatRemoteHost |
-Joption | 由于jstatd也是java进程,可以通过此参数指定该进程的启动参数,例如-J-Xms48m 设置启动时内存为48m |
2. 实战
2.1 目标和环境简介
- 本机环境简介
Win10,192.168.1.1
,oracle
Jdk 1.8.0_201 - 服务器环境简介
Centos 7.6,192.168.1.14
,open
Jdk 1.8.0_232,运行着1个tomcat,进程id7394
- 目标
从本机1.1
远程监控运行在服务器1.14
上的Tomcat进程7394
。
2.2 服务器启动jstatd
2.2.1 创建策略文件
在/root
目录下创建策略文件jstatd.all.policy
,内容如下
- JDK8版本
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
- JDK11版本
grant codebase "jrt:/jdk.jstatd" {
permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {
permission java.security.AllPermission;
};
2.2.2 启动jstatd
-J-Djava.security.policy指定策略文件
-J-Djava.rmi.server.logCalls开启调用日志
-J-Djava.rmi.server.hostname指定server的ip,避免hostname -i 为127.0.0.1时调用异常
jstatd -J-Djava.security.policy=/root/jstatd.all.policy -J-Djava.rmi.server.logCalls=true -J-Djava.rmi.server.hostname=192.168.1.14
启动日志
一月 27, 2020 9:34:03 下午 sun.rmi.server.UnicastServerRef logCall
较详细: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
一月 27, 2020 9:34:03 下午 sun.rmi.server.UnicastServerRef logCall
较详细: RMI TCP Connection(2)-192.168.1.14: [192.168.1.14: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
2.3 本地监控
此小结在本地192.168.1.1
上执行
2.3.1 jps
协议可以省略,默认rmi,当端口为1099时,端口也可以省略。关于jps使用详情可以参考:JVM监控工具-jps
# 通过jps命令查询服务器上的Java进程,发现能够显示Tomcat进程7394
C:\Users\mi>jps -l rmi://192.168.1.14:1099
7537 -- process information unavailable
7394 org.apache.catalina.startup.Bootstrap
2.3.2 jstat
关于jstat使用详情可以参考:JVM监控工具-jstat
# 使用jstat工具查看远程服务器上tomcat进程7394的gc信息
C:\Users\mi>jstat -gcutil 7394@192.168.1.14 1s 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 100.00 2.56 56.63 96.74 89.58 5 0.060 0 0.000 0.060
0.00 100.00 2.56 56.63 96.74 89.58 5 0.060 0 0.000 0.060
0.00 100.00 2.56 56.63 96.74 89.58 5 0.060 0 0.000 0.060
0.00 100.00 2.56 56.63 96.74 89.58 5 0.060 0 0.000 0.060
0.00 100.00 2.56 56.63 96.74 89.58 5 0.060 0 0.000 0.060
2.3.3 jvisualvm
双击%JAVA_HOME%\bin\jvisualvm.exe
启动jvisualvm,选择远程
,然后点击右键添加远程主机
,然后输入服务器IP地址
,点击高级设置
:
在高级设置中你会发现有个jstatd
连接,我们可以在这里选择端口和刷新时间,此处我将刷新时间设置为1秒,然后点击确定
点击确定后,在对应服务器192.168.1.14
下面出现两个java进程,一个是jstatd,一个是tomcat,我们可以双击tomcat的进程进行信息查看
信息截图:
3. RMI简介
https://www.tutorialspoint.com/java_rmi/java_rmi_introduction.htm
这个模型与当前流行的微服务架构如出一辙。
RMI概念 | RMI实现 | 微服务概念 | 实现 |
---|---|---|---|
RMI server | jstatd | 生产者 | 服务提供方 |
RMI client | jps、jstat、jvisualvm | 消费者 | 服务调用方 |
RMI registry | rmiregistry | 注册中心 | zk 、eureka、nacos |
执行大体流程为:RMI server向RMI registry注册自己,然后RMI client从RMI registry请求到RMI server的相关信息,然后直接调用RMI server。