jps无法连接到远程jstatd

我正在尝试使用jstatd使用jps查询远程JVM,以便最终使用VisualVM监视它。

我使用以下安全策略运行jstatd:

grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; }; 

jstatd在64位Linux机器上运行,其中包含1.6.0_10版本的HotSpot vm。 jstatd命令是:

 jstatd -J-Djava.security.policy=jstatd.tools.policy -J-Djava.rmi.server.logCalls=true 

我正在尝试从Windows 7机器运行jps。 由于防火墙的限制,我正在通过SSH隧道将RMI数据隧道传输到我的Windows机器,以便jps命令行是:

  .\jps.exe -m -l rmi://localhost 

当我运行jps时,我在jstatd日志中看到了连接尝试,如下所示:

 Feb 1, 2011 11:50:34 AM sun.rmi.server.UnicastServerRef logCall FINER: RMI TCP Connection(3)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(ja va.lang.String)] 

但在jps方面,我收到以下错误:

 Error communicating with remote host: Connection refused to host: 192.168.1.137; nested exception is: java.net.ConnectException: Connection refused: connect 

基于jstatd日志中列出的连接尝试,我认为jps实际上是到达主机,但由于某种原因被阻止。 是否有我设置的安全策略或某些其他设置,我可以更改,以便我可以让jps从远程jstatd拉取统计数据?

我的猜测是你只转发RMI注册表端口(1099),但你还需要打开另一个端口。

检查远程端的端口

 # netstat -nap | grep jstatd tcp 0 0 :::1099 :::* LISTEN 453/jstatd tcp 0 0 :::58204 :::* LISTEN 453/jstatd 

在这种情况下,您需要转发端口58204以及1099

以下是您可以轻松完成此操作的方法。

  1. 以这种方式在远程主机中启动ejstatd (从ejstatd文件夹执行): mvn exec:java -Dexec.args="-pr 2000 -ph 2001 -pv 2002"
  2. 打开远程主机上的这3个端口,使其可用于本地计算机: 20002002
  3. 在本地计算机上,您将能够使用jps将远程主机名替换为jps -m -l rmi://:2000

免责声明:我是开源ejstatd工具的作者