JVisualVM 内存采样:不支持远程应用程序

Posted

技术标签:

【中文标题】JVisualVM 内存采样:不支持远程应用程序【英文标题】:JVisualVM Memory Sampling : Remote applications are not supported 【发布时间】:2011-09-14 14:25:17 【问题描述】:

我正在尝试在 Red Hat Linux 中使用 JVisualVM 监控远程 tomcat 进程。 CPU 采样工作正常,但内存采样选项卡被禁用。它说“内存采样:不可用。不支持远程应用程序”

进程的命令行参数:

-Djavac.source=1.5 -Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=11107

JVisualVm 详细信息:

Version: 
1.6.0_24 (Build 100930); platform 100909-1140d3a55456
System: 
Linux (2.6.18-53.1.14.el5) , i386 32bit
Java: 
1.6.0_24; Java HotSpot(TM) Client VM (19.1-b02, mixed mode)

有什么我想念的吗?我对这一切都很陌生。

【问题讨论】:

两台机器上的jdk版本都是1.6时-Djavac.source=1.5会不会有问题? 【参考方案1】:

您可以通过

解决此错误

$ ssh -Y user@remotemachine

$ wget http://java.net/projects/visualvm/downloads/download/release135/visualvm_135.zip

$ unzip visualvm_135.zip

$ cd visualvm_135/bin

$ ./visualvm

此 visualvm 实例将功能齐全,包括内存和 CPU 采样。

在此处阅读更多信息:http://shahriarinia.blogspot.com/2013/05/java-cpumemory-heap-usage-monitoring.html

http://mshahriarinia.com/

【讨论】:

不知道为什么这个答案被否决了。它工作得很好,并且提供了比公认答案更多的细节。【参考方案2】:

内存采样使用Attach API,它仅适用于在与 VisualVM 相同的用户下运行的本地应用程序。您可以在远程机器上运行 VisualVM 并使用远程 X 会话在本地机器上显示输出。

【讨论】:

谢谢 tomas,如果可能的话,请您解释一下或提供一些链接,如何使用远程 x 会话 @Jitendra 最简单的方法是使用 'ssh -Y' 登录到远程计算机并从远程 shell 启动 VisualVM。 这个答案并没有真正解释你需要知道的一切,特别是如何完成远程 X 会话。【参考方案3】:

遵循先前给出的答案,但还有一些需要确认的部分:

    无法远程采样内存 使用 X 运行 VisualVM 的本地到 jvm 实例并将 DISPLAY 导出回您的工作站

    jdk_1.7.0_25 存在一些令人讨厌的问题,至少在我的情况下,在 CentOS 下会导致尝试运行 jvisualvm 或下载的 VisualVM 时抛出异常:

    java.lang.NoClassDefFoundError: 无法初始化类 sun.awt.SunToolkit

    使用相同的用户帐户来运行您的目标 JVM(在我的例子中是 Tomcat 服务器)和您的 VisualVM 实例

根据之前的回答,这很有用(谢谢Morteza Shahriari Nia)

$ ssh -Y user@remotemachine
$ wget http://java.net/projects/visualvm/downloads/download/release135/visualvm_136.zip
$ unzip visualvm_136.zip
$ cd visualvm_136/bin
$ ./visualvm

每次运行“visualvm_136/bin/visualvm”之前,将您的 X 显示器放回您需要的工作站...

    本地机器:$ xhost + 远程机器:$ export DISPLAY=your_workstation_ip:0.0

一旦它启动(并且您的目标 JVM 已经在运行并且您的用户帐户与上述 #4 相同),您将在 VisualVM 的“本地”部分中看到您的目标 PID。

我能够使用不同版本的 jdk 并且仍然能够看到内存采样器已启用 - 在我的情况下,目标 Tomcat JVM 正在运行 jdk_1.7.0_25,而我的 VisualVM 实例是早期版本 jdk_1.7.0_04(由于问题#3,VisualVM 必须使用不同的版本)。

希望对您有所帮助...

【讨论】:

以上是关于JVisualVM 内存采样:不支持远程应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用JVisualVM远程监控和优化Tomcat和Java程序的内存和CPU

jVisualVM中采样和分析的区别

使用jvisualvm远程监控Java程序

Spark(五十):使用JvisualVM监控Spark Executor JVM

如何使用jvisualvm进行cpu或内存抽样

jvisualvm的使用