VisualVM over ssh

时间:2009-10-22 21:09:05

标签: ssh visualvm

我读过Visual VM remotely over ssh但我认为我还没有完全理解,因为它不适合我:-(请有人举个例子吗?

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

任何帮助?

8 个答案:

答案 0 :(得分:37)

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

Jstatd:

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

之后:向目标计算机添加远程连接,并在该远程连接的属性上配置jstatd连接。

(permissions.txt包含例如:

grant {
  permission java.security.AllPermission;
};

修改(回复评论)

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

    您现在应该在visualvm

  5. 中看到远程端的进程

答案 1 :(得分:22)

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

使用选项启动JVM:
      -Dcom.sun.management.jmxremote =真
      -Dcom.sun.management.jmxremote.ssl =假
      -Dcom.sun.management.jmxremote.authenticate =假
      -Dcom.sun.management.jmxremote.port = [端口1]
      -D的 java.rmi.server.hostname =本地主机
      -Dcom.sun.management.jmxremote.rmi.port = [端口2]

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

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

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

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

答案 2 :(得分:12)

我在localhost上遇到了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上完全提醒了我 希望你不介意ankon 顺便说一句,谢谢你这样做:)

答案 3 :(得分:11)

通过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
    

答案 4 :(得分:4)

我还发现了jvm参数:

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

在我正在使用1.3.2的构建上不起作用。

因此我使用了工具&gt;选项&gt;网络并在SOCKS设置下手动设置。

但是VisualVM确实还没有找到远程进程。然后我删除了localhost的“无代理主机”监听,因为这可能会阻止它。

答案 5 :(得分:3)

我发现代理的jvm参数不起作用。至少在1.3.3版本(版本111013)中。在工具&gt;中设置代理选项&gt;网络为我工作。此外,系统范围的代理设置应该可以工作,但是它会影响所有其他网络连接。

答案 6 :(得分:0)

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

我无法使用jvisualvm,因为它没有使用SOCKS代理(我在ssh -v -D 9696中没有看到与jvisualvm相关的任何内容)。远程应用程序从未出现在jvisualvm中。然而,VisualVM会在几秒钟后显示它们。

答案 7 :(得分:0)

我知道这个问题很旧,但是我建议使用更简单的解决方案,而不是使用jstat。

仅使用SSH和Jvisualvm

  1. 带有sockproxy的ssh(例如ssh -D 6666 host@123.123.123.123)
  2. 使用袜子运行jvisualvm(jvisualvm.exe -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 6666)
  3. 添加JXM主机(例如:234.234.234.234:16000)

使用jvisualvm简单方法检测内存泄漏并监视CPU,应用程序RAM