54

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

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:打开失败:连接失败:连接被拒绝”。

有什么帮助吗?

4

9 回答 9

46

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

状态:

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. 在视觉虚拟机中:添加新的远程连接,并将远程指定为主机和 jstatd 的端口(默认为 1099,或者在运行 jstatd 时使用 -p 指定的内容)

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

于 2009-10-26T23:49:45.990 回答
29

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

使用以下选项启动 JVM:
-Dcom.sun.management.jmxremote=true
-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”至少需要 Java 7 更新 4(我在某处读过,没有检查此信息 - 在您的服务器机器检查真正使用的端口)。

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

通过 ssh 连接到服务器并将本地端口 1和端口2 转发到服务器上的 localhost: port1 |2。

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

于 2015-07-02T13:23:30.897 回答
17

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

本教程帮助我解决了我的问题。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
    
于 2017-05-09T14:07:59.850 回答
13

我在本地主机上遇到 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 地址。

从这个答案中窃取,我在我的网站上做了一个完整的提醒..我希望你不介意 ankon 顺便说一句:)

于 2015-03-15T11:17:41.837 回答
5

我还发现 jvm 参数:

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

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

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

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

于 2012-10-24T12:09:37.080 回答
3

我发现代理的 jvm 参数不起作用。至少在 1.3.3 版(内部版本 111013)中。在工具 > 选项 > 网络中设置代理对我有用。此外,系统范围的代理设置应该可以工作,尽管根据定义它会影响所有其他网络连接。

于 2011-11-24T03:13:41.967 回答
0

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

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

于 2017-01-23T11:32:35.833 回答
0

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

只使用 SSH 和 Jvisualvm

  1. ssh 与 sockproxy (ex ssh -D 6666 host@123.123.123.123 )
  2. 用 sock 运行 jvisualvm ( jvisualvm.exe -J-DsocksProxyHost=localhost -J-DsocksProxyPort=6666 )
  3. 添加 JXM 主机(例如:234.234.234.234:16000)

使用 jvisualvm 简单的方法来检测内存泄漏并监控应用程序的 CPU、RAM

于 2019-01-10T03:42:40.873 回答
0

适合我的 Google Cloud gcloud:

  • 使用 putty/ssh 创建一个 SOCKS 隧道(putty 连接 > ssh > 隧道 > ssh -D61099 的动态源端口 61099)
  • Java 选项(!删除您已采取的所有其他建议):
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
  • VisualVM:工具 > 选项 > 网络 > 手动 > SOCKS 代理:localhost 端口:61099
  • 按确定,在应用程序树中,右键单击并“添加远程主机”
  • ! 使用虚拟机的内部 ip (10.128.xx)
  • 右键单击该主机节点并添加 JMX
  • 输入 10.128.xx:1099
于 2021-09-07T15:07:33.683 回答