使用JVisualVM从Java中的远程应用程序获取堆转储

使用JVisualVM从Java中的远程应用程序获取堆转储,java,monitoring,heap,jvisualvm,Java,Monitoring,Heap,Jvisualvm,我运行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; }; 然后我使用命令行启动实际的应用

我运行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.hospotdiagnostic dumpHeap操作进行远程堆转储。我希望将转储传输到客户端,并使用JVisualVM提供的工具进行分析。如何才能做到这一点?

您无法远程分析堆。您可以在服务器上运行visualvm,并将x会话导出到本地计算机。您必须在您的服务器上安装x11,而许多服务器都没有安装。不幸的是,没有一种自动化的方法来实现这一点。您必须在Linux服务器上手动运行jmap以转储JVM的堆,然后将生成的堆转储复制到运行JVisualVM的本地机器上,并使用File | Load。。。将堆转储加载到JVisualVM中进行分析。

有一种方法

  • rmiregistry-J-Xbootclasspath/p:$JAVA_HOME/lib/sa-jdi.jar(使用端口1099)
  • 在运行应用程序的计算机上启动“jsadebugd”:jsadebugd&(JVM的pid)
  • 在远程机器上使用以下命令 jmap-dump:file=:1099

  • 杰哈特

  • 上述操作将在端口7000启动一个web应用程序

    以上所有工具都是JDK1.6的一部分


    祝你一切顺利

    自1.3以来,VisualVM支持远程堆转储:

    从VisualVM 1.3开始,现在可以使用工具中的堆转储操作和按钮对远程运行的应用程序进行堆转储。调用时,将显示一个对话框,允许您在远程系统上指定要转储堆的完整路径。创建堆转储后,需要手动将文件复制到本地计算机,并使用加载操作使用VisualVM打开和分析文件


    请参阅:

    这会导致运行应用程序的性能损失吗?也许这无关紧要。以运行java进程的同一用户的身份运行jvisualvm可能会help@rogerdpack说得好!我找到了这个问题/主题,因为我的问题和你的一样,我认为你的陈述/假设是正确的。当我在我的开发者PC/服务器上通过我的NetBeans IDE运行tomcat/tomee时,Sampler>Memory按钮被启用,但Sampler>Memory按钮在生产服务器上被禁用,因为tomcat/tomee是作为Windows服务运行的,而我“没有”作为system或localservice登录到生产服务中(