jvisualvm连接到远程jstatd无法显示应用程序

11

我在远程服务器(Ubuntu Server 14.04)上启动了jstatd

jstatd -J-Djava.security.policy=.jstatd.all.policy -J-Djava.rmi.server.logCalltrue -p 9099

我尝试在Windows上使用jvisualvm连接它。我检查了netstat,发现连接已建立,在远程主机上记录了调用:

Sep 11, 2015 12:48:51 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(4)-10.82.199.0: [10.82.199.0: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Sep 11, 2015 12:48:55 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(4)-10.82.199.0: [10.82.199.0: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Sep 11, 2015 12:48:59 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(4)-10.82.199.0: [10.82.199.0: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]

所有的迹象都表明它正在工作。但是在jvisualvm中没有显示任何应用程序:

enter image description here

enter image description here

4个回答

28

显然,VisualVM期望您远程连接时指定的服务器(在您这种情况下是Ubuntu Server 14.04)有一个一致的DNS名称。因此,如果您向VisualVM指定IP地址而不是DNS名称,则应将以下内容添加到jstatd启动行中:

-J-Djava.rmi.server.hostname=<the IP address to your Ubuntu server here>

此外,我发现在某些 VisualVM 版本中,指定 端口选项 (在您的情况下为 -p 9099)不受支持

已知限制:在此 VisualVM 版本中,启动 jstatd 实用程序时必须使用 jstatd 的默认端口和 rminame,即不支持使用 -p 和 -n 选项。 VisualVM 故障排除指南

总的来说,您应该尝试在 Ubuntu 服务器上运行以下 jstatd 命令:

jstatd -J-Djava.security.policy=.jstatd.all.policy -J-Djava.rmi.server.hostname=10.82.83.117 -J-Djava.rmi.server.logCalltrue


参考资料:

  1. http://www.catify.com/2012/09/26/remote-monitoring-with-visualvm/
  2. 这对我有效 :)

将IP地址作为主机名选项添加解决了我的问题。感谢您的答案。 - thaspius
1
如果有人对上述命令有问题,那么参数“-J-Djava.rmi.server.logCalltrue”应该改为“-J-Djava.rmi.server.logCalls=true”。 - negora

2
jstatd -p 1099 -J-Djava.rmi.sver.hostname=10.250.105.112 -J-Djava.security.policy=<(echo 'grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;};')      

我的表现非常完美

2
在JDK 11中,tools.jar被模块所取代。您可能需要探索jrt:/jdk.jstatd - Drakes
java.rmi.sver.hostname 应该是 java.rmi.server.hostname 吗? - Ron McLeod

0

如果这能帮到其他人...

我遇到了问题,无论是使用 jstatd 还是在 VisualVM 中添加普通的 JMX 连接都无法正常工作。前者不会给出任何错误消息,只是不会列出任何应用程序。后者会给出一个错误,说 "Cannot connect to some-server:30648 using service:jmx:rmi:///jndi/rmi://some-server:30648/jmxrmi

尝试使用优秀的 sjk-plus 工具手动连接到 JMX 服务时,会出现以下错误:

$ java --add-opens java.base/jdk.internal.perf=ALL-UNNAMED \
       --add-opens jdk.attach/sun.tools.attach=ALL-UNNAMED \
       -Dsjk.breakCage=false \
       -jar scripts/sjk-plus-0.14.jar 
       mx --get --allMatched -b com.acme.some.package:name=* -f Count \
      -s some-server:30648
JMX Connection failed: java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: 
    java.net.ConnectException: Connection refused (Connection refused)

你看到了吗?127.0.1.1,那个奇怪的IP地址在干什么?

这是由服务器上/etc/hosts文件中的特定条目引起的:

user@some-server:~$ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   some-server

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

修改hosts文件中的some-server条目并重新启动进程,使其能够与sjk-plus一起工作,并且也可以被jstatd发现。


0

在Java 11+中

jstatd -J-Djava.rmi.server.logCalls=true \
    -J-Djava.security.policy=.jstatd.all.policy \
    -J-Djava.net.preferIPv4Stack=true \
    -J-Djava.security.policy=<(echo 'grant codebase "jrt:/jdk.jstatd" {permission java.security.AllPermission;}; grant codebase "jrt:/jdk.internal.jvmstat" {permission java.security.AllPermission;};')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接