2011-02-01 95 views
12

我试图用jst使用jstatd查询远程JVM,以便最终使用VisualVM监视它。jps无法连接到远程jstatd

我得到jstatd有下列安全政策运行:

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

    permission java.security.AllPermission; 
}; 

jstatd是在64位Linux主机,并1.6.0_10版的HotSpot虚拟机上运行。 jstatd命令是:

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

我试图从Windows 7机器运行jps。由于防火墙的限制,我通过SSH隧道来我的Windows机器包裹RMI数据使得JPS命令行是:

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

当我运行太平绅士,我看到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提取统计信息?

+0

可能是因为我没有在我要监视的应用程序中设置jmxremote属性,如下所述:http://stackoverflow.com/questions/726643/get-heap-dump-from-a-remote-application-in-java-using-jvisualvm – afrosteve 2011-02-02 20:04:19

回答

13

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

检查遥控器上侧

# netstat -nap | grep jstatd 

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

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

+0

不,这没有帮助。我隧道到另一个端口,在我的情况下45998,但jps仍然无法连接。 – afrosteve 2011-02-01 20:18:40

0

这里是你如何可以很容易地做到这一点。

  1. 启动ejstatd在远程主机这样(从ejstatd文件夹执行):mvn exec:java -Dexec.args="-pr 2000 -ph 2001 -pv 2002"
  2. 远程主机上打开这3个口岸,使它们可供您的本地机器:200020012002
  3. 在本地机器上,你将能够使用jps与远程主机名代替<remotehost>jps -m -l rmi://<remotehost>:2000

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