【问题标题】:VisualVM over ssh基于 ssh 的 VisualVM
【发布时间】:2009-10-22 21:09:05
【问题描述】:

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

有什么帮助吗?

【问题讨论】:

  • 您不必从 VisualVM 连接到远程主机吗?我现在没有机器可以测试,但你只创建了一个 socks 代理,你还得用它做点什么。
  • 感谢您的评论 - 我尝试了几种“变体”,但都没有奏效。
  • 自 2015 年起,您可以同时隧道化 jmx 和 rmi 端口,请参阅my answer

标签: ssh visualvm


【解决方案1】:

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

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

【讨论】:

  • 对不起,我不明白。我可以在远程端启动 jstatd 线路,但是我必须使用“ssh -D 9696 me@remote”还是“ssh me@remote”就足够了?我仍然需要visualvm的代理东西——等等。这很尴尬,但我想我需要一个分步指南。
  • 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中:添加新的远程连接,并指定远程作为主机和端口jstatd(默认为 1099,或者您在运行 jstatd 时使用 -p 指定的内容)您现在应该在 visualvm 中看到远程端的进程
  • 我试过这个,但没有运气。你到底把什么作为远程主机?通常你会想要'localhost'(相对于代理服务器),但是 VisualVM 抱怨 Local 已经被监控了。我尝试了目标主机的内部和外部IP,但我没有看到任何进程。
  • @Yang 使用目标主机的内部 IP 为我工作
【解决方案2】:

我有另一个解决方案,使用 标准 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]
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[port2]

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

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

通过 ssh 连接到服务器并将您的本地 port1port2 转发到服务器上的 localhost:port1|2。

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

【讨论】:

  • 很棒的信息...这使用 SSH 隧道为我解决了这个问题。关键是必须配置和转发 2 个端口。
  • 仅供参考 port1 可以等于 port2 所以你只能使用一个端口
  • ssh -L <local_port_1>:<ip_target_jvm_is_running>:<remote_port_1> -L <local_port_2>:<ip_target_jvm_is_running>:<remote_port_2> localhost 这是Connect via ssh to the server and forward your local port1 and port2 to localhost:port1|2 an the server.的对应部分吗?
【解决方案3】:

我在通过 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】:

    我在本地主机上遇到 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 上做了一个完整的提醒.. i 希望你不介意安康 顺便说一句,谢谢你:)

    【讨论】:

    • 在 UI 中设置代理对我不起作用,在命令行中指定它就可以了。谢谢。顺便说一句,我使用的是 1.8.0_25 版本(Build 140407)
    • 在 visualvm GUI 中定义 SOCKS 代理对我不起作用。不过,这些 CLI 参数运行良好。
    【解决方案5】:

    我还发现jvm参数:

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

    不适用于我使用 1.3.2 的构建。

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

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

    【讨论】:

    • 我还必须打开本地属性并添加一个 jstat 配置端口 1099(或您为 jstatd 选择的任何端口)
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

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

        只使用 SSH 和 Jvisualvm

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

        使用 jvisualvm 轻松检测内存泄漏并监控应用程序的 CPU、RAM

        【讨论】:

          【解决方案9】:

          适用于我的 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
          • 按确定,在应用程序树中,右键单击并“添加远程主机”
          • !使用VM的内部ip (10.128.x.x)
          • 右键单击该主机节点并添加 JMX
          • 输入 10.128.x.x:1099

          【讨论】:

            猜你喜欢
            • 2012-03-08
            • 1970-01-01
            • 1970-01-01
            • 2012-06-16
            • 1970-01-01
            • 1970-01-01
            • 2021-09-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多