1

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

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

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

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

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

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

PS:是否有可以在 JVM 主机上执行以转储堆的 3rd 方实用程序?此外,客户此时无法升级 JRE。并且上一个问题的答案都没有被选为答案!

谢谢,

4

1 回答 1

2
  1. To dump heap from within JVM, use com.sun.management.HotSpotDiagnosticMXBean:

        HotSpotDiagnosticMXBean hs =
                ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
        hs.dumpHeap("/path/to/heapdump.bin", false);
    
  2. To dump heap of another process from outside, use HotSpot Dynamic Attach mechanism.
    I wrote a tiny utility for that, see https://github.com/apangin/jattach.

    Build the program with make and then run

    jattach <PID> dumpheap /path/to/heapdump.bin
    
于 2016-03-29T13:44:00.340 回答