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

从应用程序内请求java堆转储(核心转储),java,monitoring,coredump,Java,Monitoring,Coredump,我需要一种从应用程序中请求堆转储的方法 理由:当我遇到一个特定的错误情况时,我希望转储堆,这样我就可以看到内存中保存着什么 但我想自动化这一点(例如,当我检测到某些特定情况发生时,或者当看门狗不再获得ping时,当某些测试失败时)。因此,我需要一种从应用程序本身内部转储堆的方法。我似乎找不到MXBeans的东西。虽然MX bean可以提供非常好的堆栈跟踪,包括监视器和“可拥有的同步器”信息、死锁和争用信息,但我似乎找不到请求堆转储的方法。有这样的办法吗?或者通过一些间接的方式,例如,这些JVis

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

理由:当我遇到一个特定的错误情况时,我希望转储堆,这样我就可以看到内存中保存着什么


但我想自动化这一点(例如,当我检测到某些特定情况发生时,或者当看门狗不再获得ping时,当某些测试失败时)。因此,我需要一种从应用程序本身内部转储堆的方法。我似乎找不到MXBeans的东西。虽然MX bean可以提供非常好的堆栈跟踪,包括监视器和“可拥有的同步器”信息、死锁和争用信息,但我似乎找不到请求堆转储的方法。有这样的办法吗?或者通过一些间接的方式,例如,这些JVisualVM是如何实现的?您可以告诉JVM在OutOfMemoryExceptions上转储内核。

使用VM选项
-XX:+HeapDumpOnAutofMemoryError
告诉热点VM在内存不足时生成堆转储如何?

如果可以的话,有一种依赖于热点的方式。

+1:唯一的“特定错误条件”OP可以合理地知道某些东西保留在内存中,这是一个OutOfMemoryError;在这种情况下,此时转储堆会给出所需的堆转储。@Andrzej:为什么这是唯一“合理”的错误条件?有很多方法可以从内部了解VM的内存状况,例如WeakReference、检查运行时和MX bean的内存计数器等(在System.gc()之前和之后)-boatloads。JProfiler非常棒,但我想要一个程序化的、非JProfiler的解决方案。还有一个家伙的问题我可以理解:我打赌他一定会喜欢我在这里得到的解决方案!太棒了,正是我想要的,谢谢!我发现在谷歌搜索的过程中竟然没有找到那篇博文,真是太神奇了。在sun.management下,显然有很多乐趣!不过,还有一条评论(回到OP中发布的想法):从您的“OutOfMemoryError上的转储堆”链接中,我可以读到:“内置堆转储程序也可以用于在其他时间拍摄堆的快照。这是使用jmap命令行实用程序或jconsole监视和管理控制台完成的。”。这些工具可能会使用第二个链接所指的专有MXBean?我觉得奇怪的是,标准MX bean没有这个dumpHeap(fileName,live)方法。是的,有点恼人,但我想如果这是一个标准功能,堆转储格式也应该标准化。至少,我认为这需要大量的工作,而且可能会限制供应商在虚拟机实现中的自由度