仅在 Windows 从 JRE 获取堆转储

get a heap dump from a JRE only on Windows

我们的产品 运行 在我们客户的服务器上,在 Windows.

上只有一个 JRE(没有 JDK)

我知道我可以通过标志获取 OutOfMemoryError 的堆转储。

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

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

最好能请客户下载这个tool/utility然后运行到服务器上随意获取heap dump

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

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

谢谢,

  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