从应用程序内请求Java堆转储(核心转储)


问题内容

我需要一种 从应用程序内部 请求堆转储 的方法

基本原理:当遇到特定的错误情况时,我想转储堆,以便可以看到内存中有什么内容。

但是我想使它自动化(例如,当我检测到某些特定情况发生时。或者当看门狗不再收到ping命令时;当某些测试失败时)。因此,我需要一种从应用程序本身内部转储堆的方法。我似乎无法通过MX
bean的东西找到它。尽管MX
Bean可以通过监视器和“可拥有的同步器”信息,死锁和争用信息给出非常好的堆栈跟踪,但我似乎找不到找到请求堆转储的方法。有什么办法吗?还是通过某种间接方式,例如,这些JVisualVM事情是如何做到的?并且可以告诉JVM在OutOfMemoryExceptions上转储核心。


问题答案:

如果还不足以在其上转储堆OutOfMemoryError,那么可以通过一种依赖HotSpot的方式从Java应用程序中编程方式转储堆