我读过Visual VM remotely over ssh但我认为我还没有完全理解,因为它不适合我:-(请有人举个例子吗?
ssh -D 9696 login@ip.of.external.machine
和visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
启动visualvm,但没有显示外部机器的进程(只有本地的进程如visualvm本身)。此外,有时(但并非总是)我在ssh窗口中收到消息“通道3:打开失败:连接失败:连接被拒绝”。
任何帮助?
答案 0 :(得分:37)
您需要在远程端运行jstatd,或使用host:port指定JMX连接。
Jstatd:
jstatd -J-Djava.security.policy=permissions.txt [-p port]
之后:向目标计算机添加远程连接,并在该远程连接的属性上配置jstatd连接。
(permissions.txt包含例如:
grant {
permission java.security.AllPermission;
};
修改(回复评论)
ssh -D 9696 me@remote
,并在远程命令行上运行如上所述的jstatd。如果希望jstatd位于与默认值1099不同的端口上,请使用jstatd的-p参数。 visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
:添加新的远程连接,并指定remote作为主机和jstatd的端口(默认情况下为1099,或者在运行jstatd时使用-p指定的内容)
您现在应该在visualvm
答案 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
使用jvisualvm简单方法检测内存泄漏并监视CPU,应用程序RAM