2009-10-22 169 views
37

我讀過Visual VM remotely over ssh,但我認爲我沒有完全理解,因爲它不是爲我工作:-(請有人可以給些例子嗎?的VisualVM通過ssh

ssh -D 9696 [email protected]visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true啓動VisualVM的,但沒有過程(但不是總是),我在我的ssh窗口中收到了「通道3:打開失敗:連接失敗:連接被拒絕」的消息

任何幫助?

+0

唐設置兩個端口你不得不連接到來自VisualVM的遠程主機?我現在沒有機器可以測試,但是您只創建了一個襪子代理,但您仍然需要對其進行操作。 – 2009-10-22 21:26:21

+0

感謝您的評論 - 我嘗試了幾個'變化',但他們都沒有工作。 – bgraves 2009-10-23 11:55:03

+0

截至2015年,你可以隧道兩個jmx和rmi端口看[我的答案](http://stackoverflow.com/a/32418821/241986) – 2015-09-06 09:52:43

回答

35

您既可以在遠程端運行jstatd,也可以指定J使用主機:端口的MX連接。

Jstatd:

jstatd -J-Djava.security.policy=permissions.txt [-p port]

之後:添加到目標機器的遠程連接,並在該遠程連接的屬性配置jstatd連接。

(permissions.txt例如包含這樣的:

grant { 
    permission java.security.AllPermission; 
}; 

編輯:(應答評論)

  1. ssh -D 9696 [email protected],並在上述遠程命令行中運行jstatd如果您希望jstatd位於與默認1099不同的端口上,請使用-statat參數。
  2. 在本地機器上運行visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
  3. 在視覺VM
  4. :添加新的遠程連接和遠程指定的主機和端口jstatd(1099默認情況下,或在運行jstatd當-p指定什麼)

    您現在應該看到在進程在visualvm中的遠程端

+0

對不起,但我不明白。我能夠啓動遠程端的jstatd線,但是我必須使用「ssh -D 9696 me @ remote」或「ssh me @ remote」足夠嗎?我仍然需要visualvm的代理資源 - 等等。這很尷尬,但我想我需要一步一步的指導。 – bgraves 2009-10-28 13:48:41

+0

1)ssh -D 9696 me @ remote,然後像上面那樣在遠程命令行上運行jstatd。如果您希望jstatd位於與默認1099不同的端口上,請將-p參數用於jstatd。 2)運行visualvm.exe -J-Dnetbeans.system_socks_proxy =本地主機:添加新的遠程連接,並遠程指定爲主機和:在視覺VM本地機器 3)9696 -J-Djava.net.useSystemProxies =真端口jstatd(1099默認情況下,或運行時,你使用-p指定什麼jstatd) 您現在應該看到在VisualVM的 – ankon 2009-10-28 14:38:31

+0

阿遙控器上側的過程,現在它的工作原理 - 非常感謝你! :-) – bgraves 2009-10-28 15:51:09

2

我發現在代理的jvm參數不起作用。至少在版本1.3.3(build 111013)中。在工具>選項>網絡中設置代理爲我工作。系統範圍的代理設置也應該工作,儘管從定義上講,它會影響所有其他網絡連接

3

我也發現了JVM參數:

-J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true 

沒有對我使用1.3.2構建工作。

因此,我使用了工具>選項>網絡,並在SOCKS設置下手動設置它。

但是VisualVM的確沒有找到遠程進程。然後,我刪除了「無代理主機」監聽本地主機,因爲這可能會阻止它。

9

我jstatd在本地主機上綁定的問題,所以我不得不鍵入

jstatd -J-Djava.security.policy=allPerm.policy -J-Djava.rmi.server.logCalls=true -p <port> -J-Djava.rmi.server.hostname=<my ip> 

也jvisualvm我使用這個參數,而不是

jvisualvm -J-DsocksProxyHost=localhost -J-DsocksProxyPort=<socks-port> 

這樣,通過ssh的代理連接,我可以使用我的遠程機器的真實IP地址。

從這個答案我自己上my site全提醒偷竊..我 希望大家不要被我用標準SSH隧道另一種解決方案的方式:)

+0

設置代理在用戶界面不起作用,指定它在命令行上工作。謝謝。順便說一句,我正在使用版本1.8.0_25(內部版本140407) – 2015-10-13 09:45:08

+2

在visualvm GUI中定義SOCKS代理沒有爲我工作。不過,這些CLI參數運行良好。 – Will 2016-03-15 17:05:42

11

介意Ankon酒店 感謝這個和沒有防火牆端口來打開。 對我來說,SOCKS代理不起作用。
-Dcom.sun.management.jmxremote =真
-Dcom.sun.management.jmxremote.ssl =假
-Dcom.sun.management.jmxremote.authenticate =假:

與選項啓動JVM
-Dcom.sun.management.jmxremote.port = [端口1]
-D java.rmi.server.hostname =本地主機
-Dcom.sun.management.jmxremote.rmi.port = [ port2]

重要的部分是「server.hostname = localhost」。此外,您明確定義了兩個端口(連接+「隨機」RMI端口),「jmxremote.rmi.port」至少需要Java 7更新4(我在某處閱讀,未檢查此信息 - 在您的「lsof -i」服務器機器來檢查真正使用的端口)。

(當然,你可以使用身份驗證或SSL)

連接通過SSH服務器,並轉發當地端口1PORT2爲localhost:端口1 | 2的服務器。

在VisualVM中打開一個到localhost:port1的JMX連接(沒有任何代理設置)。

+1

偉大的信息...這解決了我使用SSH隧道。關鍵是2個端口必須進行配置和轉發。 – Shane 2016-04-20 12:08:26

+1

僅供參考*端口1 *可以等於*端口2 *,因此您只能使用一個端口 – 2016-06-10 15:04:45

+0

您讓我的男人一天!你是野獸。 – Aladdin 2017-12-05 10:21:02

0

嘗試不同版本jvisualvm的(例如,從https://visualvm.github.io/download.html最新)

我不能使它與jvisualvm工作,因爲它沒有使用SOCKS代理(我沒看jvisualvm相關的任何事情在ssh -v -D 9696中)。遠程應用程序從未出現在jvisualvm中。然而,VisualVM在幾秒鐘後顯示出來。

3

我在通過ssh將jVisualVM連接到遠程應用程序時遇到了同樣的問題。

This Tutorial幫我解決了我的問題。http://issamben.com/how-to-monitor-remote-jvm-over-ssh/

要解決此問題,確保:

  • 您在JVM配置

    -Dcom.sun.management.jmxremote.ssl=false 
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.port=9010 
    -Dcom.sun.management.jmxremote.rmi.port=9011 
    -Djava.rmi.server.hostname=localhost 
    -Dcom.sun.management.jmxremote.local.only=false 
    
  • SSH隧道正常建立

    ssh -i yourPermissionFile.pem -l username 101.101.101.101 -L 9010:localhost:9010 -L 9011:localhost:9011 
    
+0

非常感謝分享!它爲我工作 – 2018-01-06 11:18:16