仅在Windows上从JRE获取堆转储

时间:2016-03-29 08:32:21

标签: java jvm heap-dump heap-profiling

我们的产品在我们客户的服务器上运行,在Windows上只有一个JRE(无JDK)。

我知道我可以通过标志在OutOfMemoryError上获得堆转储。

但是,有没有办法主动从JRE JVM进程获取堆转储?

我计划获得一些健康的堆转储,并将它们与OutOfMemoryError上获得的堆转储进行比较。

最好,我应该能够要求客户下载此工具/实用程序,然后在服务器上运行它以随意获取堆转储。

我试过jvisualvm但是jvisualvm不会列出我们的产品jVM。它只列出当时运行的一些JVM,而不是当时运行的所有JVM。加上jvisualvm非常笨重。

P.S:是否有第三方实用程序可以在JVM主机上执行以转储堆?此外,客户此时无法升级JRE。并且没有选择上一个问题的答案作为答案!

谢谢,

1 个答案:

答案 0 :(得分:2)

  1. 要从JVM中转储堆,请使用com.sun.management.HotSpotDiagnosticMXBean

        HotSpotDiagnosticMXBean hs =
                ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
        hs.dumpHeap("/path/to/heapdump.bin", false);
    
  2. 要从外部转储另一个进程的堆,请使用HotSpot Dynamic Attach mechanism 我为此写了一个小实用程序,请参阅https://github.com/apangin/jattach

    使用make构建程序,然后运行

    jattach <PID> dumpheap /path/to/heapdump.bin