VisualVM over ssh
我已经通过ssh远程阅读了Visual VM,但是我认为我还没有完全理解,因为它不适合我:-(请问有人可以举一些例子吗?
ssh -D 9696 login@ip.of.external.machine
和ssh -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; };
编辑:(回复评论)
-
ssh -D 9696 me@remote
,然后像上面那样在远程命令行上运行jstatd。 如果您希望jstatd位于默认1099的不同端口上,请将-p参数用于jstatd。 - 在本地计算机上运行
visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
-
在可视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连接到服务器,并将本地port1和port2转发到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在几秒钟后显示出来。