使用 JVisualVM 从 Java 中的远程应用程序获取堆转储
Posted
技术标签:
【中文标题】使用 JVisualVM 从 Java 中的远程应用程序获取堆转储【英文标题】:Get heap dump from a remote application in Java using JVisualVM 【发布时间】:2010-10-18 02:51:27 【问题描述】:我运行 JVisualVM(Windows XP、Sun Java 1.6.0.13、32 位客户端 VM)来监控远程应用程序(Linux、Sun Java 1.6.0.07、64 位服务器 VM)。在启动实际的远程应用程序之前,我使用所有访问策略在远程计算机 jstatd
上启动:
grant codebase "file:$java.home/../lib/tools.jar"
permission java.security.AllPermission;
;
然后我使用命令行启动实际的应用程序
java -Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=3333
compileTest.Main
从客户端机器上,我可以看到远程应用程序并对其进行监控。我也可以进行线程转储等。不幸的是,堆转储按钮是灰色的。
如何使用 JVisualVM 从远程监控的应用程序中获取堆转储?
我尝试使用 jConsole。使用 jConsole,可以使用 com.sun.management.HotSpotDiagnostic dumpHeap 操作进行 distant 堆转储。我希望将转储传输到客户端并使用 JVisualVM 提供的工具进行分析。我该怎么做?
【问题讨论】:
以运行 java 进程的同一用户身份运行 jvisualvm 可能会有所帮助 @rogerdpack 好点!我导航到这个问题/主题,因为我和***.com/questions/8799929/… 有同样的问题,我认为你的陈述/假设是正确的。当我在开发人员 PC/服务器上通过 NetBeans IDE 运行 tomcat/tomee 时,启用了 Sampler>Memory 按钮,但在生产服务器上禁用了 Sampler>Memory 按钮,因为 tomcat/tomee 作为 Windows 服务运行,并且我'm'not' 作为系统或本地服务登录到生产服务。 :( 【参考方案1】:有办法做到这一点!
-
rmiregistry -J-Xbootclasspath/p:$JAVA_HOME/lib/sa-jdi.jar(这里使用端口 1099)
在运行应用程序的机器上启动“jsadebugd”:jsadebugd &(JVM 的 pid)
在远程机器上使用以下 jmap -dump:file= :1099
jhat
以上将在端口 7000 启动一个 Web 应用程序
以上所有工具都是 JDK 1.6 的一部分
一切顺利!
【讨论】:
这会导致正在运行的应用程序的性能下降吗?也许这无关紧要。【参考方案2】:不幸的是,没有一种自动化的方法可以做到这一点。您必须在 Linux 服务器上手动运行 jmap 以转储 JVM 的堆,然后将生成的堆转储复制到运行 JVisualVM 的本地计算机并使用 File|Load... 将堆转储加载到 JVisualVM 中进行分析。
【讨论】:
【参考方案3】:从 1.3 开始,VisualVM 支持远程堆转储:
从 VisualVM 1.3 开始,您现在可以使用工具中的堆转储操作和按钮对远程运行的应用程序进行堆转储。调用时,将显示一个对话框,您可以在其中指定要转储堆的远程系统上的完整路径。创建堆转储后,您需要手动将文件复制到本地计算机并使用 Load 操作使用 VisualVM 打开和分析文件。
见:VisualVM 1.3 Released
【讨论】:
【参考方案4】:您无法远程分析堆。您可以在服务器上运行 visualvm 并将 x 会话导出到本地计算机。您必须在服务器上安装 x11,而许多服务器没有。
【讨论】:
以上是关于使用 JVisualVM 从 Java 中的远程应用程序获取堆转储的主要内容,如果未能解决你的问题,请参考以下文章
如何使用JVisualVM远程监控和优化Tomcat和Java程序的内存和CPU
Java命令行监控_jvisualvm使用JMX连接远程机器(实践)