当前位置: 首页 > 面试题库 >

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

全丰
2023-03-14
问题内容

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

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

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


问题答案:

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



 类似资料:
  • 我正在尝试将Java进程的Linux核心转储转换为堆转储文件,适合用Eclipse MAT进行分析。根据这篇博客文章,适应于较新的OpenJDK 12,我创建了一个核心转储,然后运行将转储转换为HPROF格式: 核心转储文件是22GB,而堆转储文件只有3MB,因此命令可能无法处理整个核心转储。此外,Eclipse MAT无法打开堆转储文件,并显示以下消息:

  • 我用wiringPiISR#得到了一个核心转储 Java运行时环境检测到一个致命错误:#Internal error(os_linux_zero.cpp:254),PID=6552,TID=1866855520致命错误:捕获未处理信号11

  • 在我的jboss应用程序突然停止,核心转储文件在 /var/crash/path中生成,进程ID为。在同一位置没有生成日志。Java版本是java-1.7.0-openjdk-1.7.0.45。x86_64。我想知道为什么我的应用程序被杀死,这个文件被生成。我怀疑发生了一些内存泄漏导致了这个失败。但是在应用程序日志中没有跟踪。如何调试这个代码转储文件(大约6 GB)

  • 问题内容: 我有Java应用程序,不幸的是,它在一段时间后开始消耗大量内存。使事情复杂化的是,它不仅是Java应用程序,还是JavaFX 2应用程序。 我怀疑可能存在一些内存泄漏,甚至在底层JavaFX调用和本机库中也是如此。 理想的解决方案是在某个时刻获取所有java对象的转储(及其内存使用情况),然后分析该转储。有什么办法可以做到这一点? 问题答案: 有很多方法可以获取堆转储,从简单的工具(例

  • 问题内容: 每当进程崩溃时,我都想创建一个核心转储。目前,我正在采用这种方法: 使用gcc / g ++的“ -g”构建程序的特殊“调试”版本。 执行“ ulimit -c unlimited” 现在,只要程序崩溃,我们就获得核心转储。 但我想减少步骤数,以便: 应始终创建核心转储。即使是“发布”版本。不应要求用户手动执行命令“ ”。 该核心转储的回溯应该能够给出调用的文件,函数,行号。那是人类可

  • 我正在运行Apache Ignite应用程序。当我看到使用linux的内存使用时,我得到的使用内存为9.8GB。但是当我使用eclipse MAT进行堆转储时,它的大小只有大约1.8GB。为什么会这样?ignite中分配的默认堆内存为21 GB。我也没有做任何GC调优。