Java 无法在VisualVM中查看Visual GC

Java 无法在VisualVM中查看Visual GC,java,linux,profiler,visualvm,Java,Linux,Profiler,Visualvm,我在本地windows机器上使用Java VisualVM监视远程服务器(Linux)。 除了“visualgc”之外,我可以在bisualvm中获得所有统计信息。它显示“此JVM不支持”。我在谷歌上搜索了一下,发现可能是因为jstatd没有运行和连接。因此执行“jstatd-J-Djava.security.policy=/tmp/tools.policy”。 它显示一个ip“175.41.139.225”。我不明白它为什么要连接到这个ip。它不是我的远程机器的ip,也不是我的本地机器的ip

我在本地windows机器上使用Java VisualVM监视远程服务器(Linux)。 除了“visualgc”之外,我可以在bisualvm中获得所有统计信息。它显示“此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
[root@shipping_ptmail]#jstatd-J-Djava.security.policy=/tmp/tools.policy
无法联系注册表
拒绝主机连接:175.41.139.225;嵌套异常是:
java.net.ConnectException:连接被拒绝
java.rmi.ConnectException:拒绝连接主机:175.41.139.225;嵌套异常是:
java.net.ConnectException:连接被拒绝
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
位于sun.rmi.transport.tcp.tcpcchannel.createConnection(tcpcchannel.java:216)
位于sun.rmi.transport.tcp.tcpcchannel.newConnection(tcpcchannel.java:202)
位于sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
位于sun.rmi.registry.RegistryImpl_Stub.rebind(未知源)
位于java.rmi.Naming.rebind(Naming.java:177)
位于sun.tools.jstatd.jstatd.bind(jstatd.java:57)
位于sun.tools.jstatd.jstatd.bind(jstatd.java:66)
位于sun.tools.jstatd.jstatd.main(jstatd.java:143)
原因:java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
位于java.net.socksocketimpl.connect(socksocketimpl.java:384)
位于java.net.Socket.connect(Socket.java:546)
位于java.net.Socket.connect(Socket.java:495)
位于java.net.Socket(Socket.java:392)
位于java.net.Socket。(Socket.java:206)
位于sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
位于sun.rmi.transport.proxy.rmismastersocketfactory.createSocket(rmismastersocketfactory.java:146)
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 8个以上

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


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

您正确地认为需要运行jstatd才能使用VisualGC插件,因为VisualGC使用。看起来您正在以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
jstatd-J-Djava.rmi.server.hostname=-J-Djava.security.policy=/tmp/tools.policy
在远程服务器上

vim /tmp/tools.policy
加上

然后启动jstatsd

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

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

VisualVM绝对不是“非常依赖于版本”。它可以监视从1.4.2到JDK 8的JVM,您仍然可以在同一个JDK上运行VisualVM。此外,上面的错误与VisualVM无关-jstatd不包含任何VisualVM代码-VisualVM只使用jvmstat API,这是JRE的park。jstatd是一个守护进程,它允许jvmstat与远程主机一起工作。@TomasHurka您可以运行它,但某些版本的VisualVM没有在您使用不同的JDK时启用所有功能。也许在最新版本中已经修复了这一问题。关于
jstat
@Peter,我同意您的观点-谢谢您的建议,但我在远程机器上执行jstat时遇到了上述异常。因此,我认为这与Visual VM版本毫无关系。@Peter如果您能提供一些示例,这将非常有用。请注意,如果受监视的JVM支持,则这些功能是可用的。本地/远程监控的功能集也存在差异。VisualVM使用多种技术(jvmstat、JMX、附加API、SA)来访问受监控的JVM。其中一些在某些JVM版本或远程情况下不可用。例如,JMX在jdk5中可用,一些依赖JMX的特性在监视较旧的JDK时不可用。类似地,Attach API仅适用于本地应用程序,因此依赖它的功能在远程情况下不起作用。而tools.policy在执行
jstatd-J-Djava.rmi.server.hostname=-J-Djava.security.policy=/tmp/tools.policy
之后,仍然会得到与上面相同的异常。只是IP不同,也不是我指定的任何机器的IP每次我执行上述相同的指定命令时,都会显示相同的异常,但不同的随机IP的
连接拒绝宿主:;嵌套的异常是:
您能否尝试以tomcat用户身份运行
jstatd
?奇怪的是,
-J-Djava.rmi.server.hostname=
对您没有帮助。也许这条线对你有帮助。一般来说,这个问题似乎是由于
jstatd
无法计算出您机器的IP地址。权限!!是的,这就是我的问题:我作为管理员运行eclipse,但不是jvisualvm。谢谢,托马斯。
[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