我们的产品在我们客户的服务器上运行,在Windows上只有一个JRE(无JDK)。
我知道我可以通过标志在OutOfMemoryError上获得堆转储。
但是,有没有办法主动从JRE JVM进程获取堆转储?
我计划获得一些健康的堆转储,并将它们与OutOfMemoryError上获得的堆转储进行比较。
最好,我应该能够要求客户下载此工具/实用程序,然后在服务器上运行它以随意获取堆转储。
我试过jvisualvm但是jvisualvm不会列出我们的产品jVM。它只列出当时运行的一些JVM,而不是当时运行的所有JVM。加上jvisualvm非常笨重。
P.S:是否有第三方实用程序可以在JVM主机上执行以转储堆?此外,客户此时无法升级JRE。并且没有选择上一个问题的答案作为答案!
谢谢,
答案 0 :(得分:2)
要从JVM中转储堆,请使用com.sun.management.HotSpotDiagnosticMXBean
:
HotSpotDiagnosticMXBean hs =
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
hs.dumpHeap("/path/to/heapdump.bin", false);
要从外部转储另一个进程的堆,请使用HotSpot Dynamic Attach mechanism 我为此写了一个小实用程序,请参阅https://github.com/apangin/jattach。
使用make
构建程序,然后运行
jattach <PID> dumpheap /path/to/heapdump.bin