VisualVM 显示 "Not supported for this JVM"
VisualVM shows "Not supported for this JVM"
我正在尝试使用 VisualVM 1.4 分析远程 JVM。我本地是 运行 macOS High Sierra 10.13.6,OpenJDK 版本如下:
java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.181-b13, mixed mode)
服务器使用以下 OpenJDK 运行 Debian Stretch:
java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
当我在本地监视 JVM 进程时,我看到了所有这些选项卡并且分析工作正常。
但是,如果我远程执行此操作,我会看到如下内容:
请注意 CPU window 表示 "Not supported for this JVM" 和缩减的制表符,不包括 "Profiler"。但是,如您所见,我确实看到了 一些 数据。
我正在通过 jstatd
连接。在服务器上,关注this article,我是运行
jstatd -J-Djava.security.policy=/home/brandwatch/jstatd.all.policy -J-Djava.rmi.server.hostname=10.2.156.160 -Djava.rmi.server.logCalltrue
像 this 这样的回答表明这可能是由于不同的 JVM 版本,但是,我的似乎是相同的,尽管其中一个 运行 在 MacOS 上,另一个在 Debian 上。
缺少CPU使用信息与不同JDK版本无关。您看不到 CPU 使用数据,因为 jvmstat(通过 jstatd 导出)不提供此类信息。如果要查看 CPU 用法,则需要使用 JMX 连接。 JMX 还将允许您执行 CPU 和内存采样。仅本地应用程序支持分析。
因为,正如 Tomas Hurka 的回答正确指出的那样,远程分析不适用于 VisualVM,我使用了一些 hack 使其仍然有效:我在远程服务器上安装了 VisualVM 并通过 X 转发访问它。这样,VisualVM 就可以在本地访问进程并对其进行分析。
使用 -X
标志
ssh 进入服务器
ssh -C -X <user>@<host>
下载 [VisualVM 1.4][8]
wget https://github.com/visualvm/visualvm.src/releases/download/1.4/visualvm_14.zip
解压缩存档
unzip visualvm_14.zip
运行 VisualVM
./visualvm_14/bin/visualvm
几秒钟后,您应该会看到 VisualVM window 弹出。它不是很快(只是因为 x 转发不是),但对于我的用例来说还可以。
实现此目的的另一种方法可能是使用 VNC,但我还没有尝试过。缺点是您必须安装所有桌面包,服务器上可能不需要这些包。
我正在尝试使用 VisualVM 1.4 分析远程 JVM。我本地是 运行 macOS High Sierra 10.13.6,OpenJDK 版本如下:
java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.181-b13, mixed mode)
服务器使用以下 OpenJDK 运行 Debian Stretch:
java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
当我在本地监视 JVM 进程时,我看到了所有这些选项卡并且分析工作正常。
但是,如果我远程执行此操作,我会看到如下内容:
请注意 CPU window 表示 "Not supported for this JVM" 和缩减的制表符,不包括 "Profiler"。但是,如您所见,我确实看到了 一些 数据。
我正在通过 jstatd
连接。在服务器上,关注this article,我是运行
jstatd -J-Djava.security.policy=/home/brandwatch/jstatd.all.policy -J-Djava.rmi.server.hostname=10.2.156.160 -Djava.rmi.server.logCalltrue
像 this 这样的回答表明这可能是由于不同的 JVM 版本,但是,我的似乎是相同的,尽管其中一个 运行 在 MacOS 上,另一个在 Debian 上。
缺少CPU使用信息与不同JDK版本无关。您看不到 CPU 使用数据,因为 jvmstat(通过 jstatd 导出)不提供此类信息。如果要查看 CPU 用法,则需要使用 JMX 连接。 JMX 还将允许您执行 CPU 和内存采样。仅本地应用程序支持分析。
因为,正如 Tomas Hurka 的回答正确指出的那样,远程分析不适用于 VisualVM,我使用了一些 hack 使其仍然有效:我在远程服务器上安装了 VisualVM 并通过 X 转发访问它。这样,VisualVM 就可以在本地访问进程并对其进行分析。
使用
ssh 进入服务器-X
标志ssh -C -X <user>@<host>
下载 [VisualVM 1.4][8]
wget https://github.com/visualvm/visualvm.src/releases/download/1.4/visualvm_14.zip
解压缩存档
unzip visualvm_14.zip
运行 VisualVM
./visualvm_14/bin/visualvm
几秒钟后,您应该会看到 VisualVM window 弹出。它不是很快(只是因为 x 转发不是),但对于我的用例来说还可以。
实现此目的的另一种方法可能是使用 VNC,但我还没有尝试过。缺点是您必须安装所有桌面包,服务器上可能不需要这些包。