2011-02-01 128 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工具