【问题标题】:Unable to view Visual GC in VisualVM无法在 VisualVM 中查看 Visual GC
【发布时间】:2013-04-26 09:37:36
【问题描述】:

我在本地 Windows 机器上使用 Java VisualVM 来监控我的远程服务器 (Linux)。 除了“Visual GC”之外,我能够获得 Bisual VM 中的所有统计信息。它显示“不支持此 JVM”。我用谷歌搜索了一下,发现可能是因为 jstatd 没有运行和连接。于是执行了“jstatd -J-Djava.security.policy=/tmp/tools.policy”。 它显示了一个 IP“175.41.139.225”。我不明白为什么它试图连接到这个 ip。这不是我的远程机器的ip,也不是我的本地机器的ip。

[root@shipping_pt mail]# jstatd -J-Djava.security.policy=/tmp/tools.policy
Could not contact registry
Connection refused to host: 175.41.139.225; nested exception is:
        java.net.ConnectException: Connection refused
java.rmi.ConnectException: Connection refused to host: 175.41.139.225; nested exception is:
        java.net.ConnectException: Connection refused
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Naming.java:177)
        at sun.tools.jstatd.Jstatd.bind(Jstatd.java:57)
        at sun.tools.jstatd.Jstatd.bind(Jstatd.java:66)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:143)
Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
        at java.net.Socket.connect(Socket.java:546)
        at java.net.Socket.connect(Socket.java:495)
        at java.net.Socket.<init>(Socket.java:392)
        at java.net.Socket.<init>(Socket.java:206)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        ... 8 more

【问题讨论】:

    标签: java linux profiler visualvm


    【解决方案1】:

    在远程服务器上,

    vim /tmp/tools.policy
    

    添加,

    grant codebase "file:${java.home}/../lib/tools.jar" {
       permission java.security.AllPermission;
    };
    

    并启动 jstatsd

    jstatd -J-Djava.security.policy=/tmp/tools.policy -J-Djava.rmi.server.hostname=<public_ip>
    

    您已经准备好在本地机器上的 VisualVM 中使用 Visual GC。

    【讨论】:

      【解决方案2】:

      你说得对,你需要运行 jstatd 才能使用 VisualGC 插件,因为 VisualGC 使用jvmstat API。看起来您正在以 root 身份运行 jstatd。您是否监视以“root”身份运行的应用程序? /tmp/tools.policy 文件长什么样?尝试使用以下参数运行 jstatd:

      jstatd -J-Djava.rmi.server.hostname=<IP address of shipping_pt machine> -J-Djava.security.policy=/tmp/tools.policy
      

      【讨论】:

      • 嗨 Tomas,我的应用程序从用户“tomcat”运行。并且 tools.policy 具有“授予代码库”file:${java.home}/../lib/tools.jar" { 权限 java.security.AllPermission; };"
      • 执行jstatd -J-Djava.rmi.server.hostname=&lt;IP address of shipping_pt&gt; -J-Djava.security.policy=/tmp/tools.policy 后,我仍然遇到与上述相同的异常。只是 IP 不同,也不是我没有指定任何机器的 ip
      • 每次我执行相同的上述指定命令时,它都会显示相同的异常,但随机 IP 不同 Connection refused to host: &lt;some random IP&gt;; nested exception is:
      • 你可以尝试以tomcat用户身份运行jstatd吗?奇怪的是-J-Djava.rmi.server.hostname= 没有帮助你。也许这个线程tinyurl.com/c3q4sj3 会帮助你。一般来说,问题似乎是由jstatd 无法确定您机器的IP 地址引起的。
      • 权限!!是的,那是我的问题:我以管理员身份运行 eclipse,但不是 jvisualvm。谢谢,托马斯。
      【解决方案3】:

      VsiualVM 非常依赖于版本。如果您可以连接但某些功能不可用,我会确保您运行的是完全相同版本的 Java。

      如果无法连接,则需要更改 JVM 的权限。注意:默认情况下你只能看到你的进程。

      【讨论】:

      • VisualVM 绝对不是“非常依赖版本”。它可以监控从 1.4.2 到 JDK 8 的 JVM,并且您仍然可以在同一个 JDK 上运行 VisualVM。此外,上面的错误与 VisualVM 无​​关 - jstatd 不包含任何 VisualVM 代码 - VisualVM 只使用 jvmstat API,它是 JRE 的公园。 jstatd 是一个守护进程,它允许 jvmstat 与远程主机一起工作。
      • @TomasHurka 你可以运行它,但是某些版本的 VisualVM 没有启用所有功能,因为你有不同的 JDK。也许这已在最新版本中得到修复。我带你点一下jstat
      • @Peter - 感谢您的建议,但我在远程机器上执行 jstat 时遇到异常。所以我觉得肯定跟Visual VM版本没有关系。
      • @Peter 如果你能提供一些例子,那将会很有用。请注意,如果受监控的 JVM 支持,则这些功能可用。本地/远程监控的功能集也有所不同。 VisualVM 使用多种技术(jvmstat、JMX、Attach API、SA)来访问受监控的 JVM)。其中一些在某些版本的 JVM 或远程情况下不可用。例如 JMX 在 JDK 5 中可用,一些依赖 JMX 的功能在监视旧 JDK 时不可用。同样,附加 API 仅适用于本地应用程序,因此依赖它的功能在远程情况下不起作用。
      猜你喜欢
      • 1970-01-01
      • 2017-08-29
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 2021-02-18
      • 2013-06-10
      相关资源
      最近更新 更多