仅在 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 被选为答案!
谢谢,
要从 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
我们的产品 运行 在我们客户的服务器上,在 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 被选为答案!
谢谢,
要从 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