VisualVM over ssh

我已经通过ssh远程阅读了Visual VM,但是我认为我还没有完全理解,因为它不适合我:-(请问有人可以举一些例子吗?

ssh -D 9696 login@ip.of.external.machinessh -D 9696 login@ip.of.external.machine visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true启动visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true ,但不显示外部机器的进程(仅限于像visualvm本身的地方)。 此外,有时(但不是总是),我在我的ssh窗口中收到“通道3:打开失败:连接失败:连接被拒绝”的消息。

任何帮助?

您需要在远程端运行jstatd,或者使用host:port指定JMX连接。

Jstatd:

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

之后:添加远程连接到目标机器,并在该远程连接的属性上configurationjstatd连接。

(permissions.txt包含这样的例子:

 grant { permission java.security.AllPermission; }; 

编辑:(回复评论)

  1. ssh -D 9696 me@remote ,然后像上面那样在远程命令行上运行jstatd。 如果您希望jstatd位于默认1099的不同端口上,请将-p参数用于jstatd。
  2. 在本地计算机上运行visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
  3. 在可视vm中:添加新的远程连接,并指定远程为主机和jstatd的端口(默认情况下为1099,或者在运行jstatd时使用-p指定的内容)

    您现在应该在visualvm中看到远程端的进程

我有本地主机上的jstatd绑定的问题,所以我不得不input

 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地址。

从这个答案窃取我使自己在我的网站上充分提醒..我希望你不介意安康感谢这一点:)

我有另一个解决scheme使用标准的SSH隧道没有防火墙端口打开。 对我来说,SOCKS代理不起作用。

用选项启动你的JVM:
-Dcom.sun.management.jmxremote =真
-Dcom.sun.management.jmxremote.ssl = FALSE
-Dcom.sun.management.jmxremote.authenticate = FALSE
-Dcom.sun.management.jmxremote.port = [port1]
-D java.rmi.server.hostname = localhost
-Dcom.sun.management.jmxremote.rmi.port = [port2]

重要的部分是“server.hostname = localhost”。 另外,你明确地定义了两个端口(连接+“随机”RMI端口),“jmxremote.rmi.port”需要至lessJava 7更新4(我读过某处,没有检查这个信息 – 在你的“lsof -i”服务器机器来检查真正使用的端口)。

(当然,您可以使用身份validation或SSL。)

通过ssh连接到服务器,并将本地port1port2转发到localhost:port1 | 2服务器。

在VisualVM中打开一个JMX连接到localhost:port1(没有任何代理设置)。

我也发现了jvm的参数:

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

没有在我使用1.3.2的版本上工作。

因此,我使用工具>选项>networking,并在SOCKS设置下手动设置。

但VisualVM确实没有find远程进程。 然后我删除了“无代理主机”监听本地主机,因为这可能会阻止它。

我发现在代理的jvm参数不起作用。 至less在版本1.3.3(版本111013)。 在工具>选项>networking中设置代理为我工作。 此外系统范围的代理设置应该工作,虽然从定义上讲,它影响所有其他的networking连接

当通过ssh将jVisualVM连接到远程应用程序时,我遇到了同样的问题。

本教程帮助我解决了我的问题。 http://issamben.com/how-to-monitor-remote-jvm-over-ssh/

要解决这个问题,请确保:

  • 你在jvmconfiguration中设置了两个端口

      -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隧道已经正确build立

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

尝试不同版本的jvisualvm(例如https://visualvm.github.io/download.html中的最新版本);

因为它没有使用SOCKS代理(我没有在ssh -v -D 9696中看到与jvisualvm有关的任何东西),所以我无法使它与jvisualvm一起工作。 远程应用程序从未出现在jvisualvm中。 然而,VisualVM在几秒钟后显示出来。