jstatd.exe 是 Java 提供的一个工具,用于创建一个远程 RMI(Remote Method Invocation,远程方法调用)服务器应用程序,以便允许远程监控和管理本地 Java 虚拟机(JVM)的性能统计信息。
通过 jstatd 启动的服务器可以接收来自远程客户端(如 jconsole )的连接请求,并为其提供本地运行的 JVM 的性能数据。
在使用 jstatd 时,通常需要注意设置安全策略,以确保只有授权的客户端能够连接和获取性能数据。
该工具有两个用途:
监控JVM:jstatd 允许远程监控工具连接到运行在本机或其他机器上的 JVM,从而获取 JVM 的运行状态、内存使用、垃圾回收等统计信息。
RMI服务:jstatd 实际上是一个 RMI 服务器,它启动后监听一个特定的端口(默认为1099),等待远程连接请求。
jstatd [-nr] [-p port] [-n rminame]
命令选项如下:
-nr
-p port
-n rminame
启动 RMI 服务步骤如下:
(1)在需要被监控的服务器上面,通过 jstatd 来启动 RMI 服务。如下:
D:\share_dir\ShareDoc> jstatd -nr Could not create remote object access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.System.setProperty(System.java:792) at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
上面错误信息表面:在尝试创建一个远程对象时,由于安全策略的限制,操作被拒绝。具体来说,是因为 Java 安全管理器(SecurityManager)拒绝了尝试写入 java.rmi.server.ignoreSubClasses 系统属性的操作。
为了解决上面问题,需要配置 Java 安全访问策略,在当前目录下面创建 jstatd.all.policy 策略文件,文件内容如下:
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
然后,通过如下命令启动 RMI 服务,如下:
D:\share_dir\ShareDoc> jstatd -J-Djava.security.policy=jstatd.all.policy
执行完上述命令后,如果没有报错,则说明启动成功。我们还可以通过 netstat 查看 1099 端口,如下:
D:\share_dir\ShareDoc> netstat -ano | findstr 1099 TCP 0.0.0.0:1099 0.0.0.0:0 LISTENING 6676 TCP 192.168.30.1:52324 192.168.30.1:1099 TIME_WAIT 0 TCP [::]:1099 [::]:0 LISTENING 6676
如果你想指定 RMI 服务器的主机名或IP地址,如下:
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.22.249
一旦 RMI 服务启动,就可以使用如 jconsole、VisualVM 等工具连接到 RMI 服务器,从而远程监控 JVM。
这些工具将连接到RMI服务器指定的端口(默认为1099),并发送JMX(Java Management Extensions)请求以获取JVM的统计信息。
安全性:由于 jstatd 允许远程连接,因此必须注意安全性。确保 jstatd.all.policy 文件中的权限设置是合理的,并且只允许受信任的主机连接到RMI服务器。
防火墙和网络配置:确保RMI服务器监听的端口(默认为1099)没有被防火墙阻止,并且网络配置允许远程连接。
版本兼容性:不同版本的JDK可能具有不同版本的 jstatd 工具,因此请确保你使用的 jstatd 版本与你的JDK版本兼容。