VisualVM over ssh

bgr*_*ves 48 ssh visualvm

通过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:打开失败:连接失败:连接被拒绝".

有帮助吗?

ank*_*kon 39

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

Jstatd:

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

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

(permissions.txt包含例如:

grant {
  permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)

编辑:( 回答评论)

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

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

  • 我尝试了这个,但是没有运气。您究竟将什么作为远程主机?通常,您需要“本地主机”(相对于代理服务器),但是VisualVM抱怨本地已受到监视。我尝试了目标主机的内部和外部IP,但是没有看到任何进程。 (2认同)

Thi*_*ies 22

我有另一个解决方案使用标准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(我在某处读过,没有检查此信息 - 在您的上使用"lsof -i"服务器机器检查真正使用的端口).

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

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

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

  • FYI*port1*可以等于*port2*,因此您只能使用一个端口 (3认同)

End*_*ios 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>
Run Code Online (Sandbox Code Playgroud)

对于jvisualvm我也使用这个参数

jvisualvm -J-DsocksProxyHost=localhost -J-DsocksProxyPort=<socks-port>
Run Code Online (Sandbox Code Playgroud)

这样,通过ssh代理连接,我可以使用我的远程机器的真实IP地址.

从这个答案窃取我在我的网站上做了一个完整的提醒..我希望你不介意ankon谢谢你的方式:)

  • 在visualvm GUI中定义SOCKS代理并不适用于我.不过,这些CLI工作正常. (2认同)

sam*_*ben 12

通过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
    
    Run Code Online (Sandbox Code Playgroud)
  • ssh隧道已正确建立

     ssh -i yourPermissionFile.pem -l username 101.101.101.101 -L 9010:localhost:9010 -L 9011:localhost:9011
    
    Run Code Online (Sandbox Code Playgroud)


Tar*_*eit 5

我还发现 jvm 参数:

-J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
Run Code Online (Sandbox Code Playgroud)

不适用于我正在使用的 1.3.2 版本。

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

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