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

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

grant codebase "file:${java.home}/../lib/tools.jar" {

    permission java.security.AllPermission;
};

jstatd在具有1.6.0_10版本的HotSpot vm的64位Linux机器上运行。 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实际上已到达主机,但由于某种原因而被阻止。是否有我设置的安全策略或可以更改的其他设置,以便可以从远程jstatd获取jps的统计信息?

最佳答案

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

检查远端的端口

# netstat -nap | grep jstatd

tcp        0      0 :::1099     :::*       LISTEN      453/jstatd
tcp        0      0 :::58204    :::*       LISTEN      453/jstatd

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

10-08 17:29