哪个线程触发了OutOfMemoryException堆转储

时间:2016-06-07 13:58:36

标签: java heap-dump eclipse-memory-analyzer

我在JVM 7上运行了一个JBoss 4.2.1应用程序,它在抛出OutOfMemoryExceptions时触发了堆转储。我有jvm配置了以下开关:

-Xms1498m -Xmx3000m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError

我正在尝试通读堆转储来弄清楚究竟是什么导致了我的OOME。我看到消耗了大量的内存,但它们有点预期。我现在正在寻找的是#34;吸烟枪#34;。

我已经打开了另一个关于我的堆转储中缺少内存的SO issue here,所以我试图弄清楚当OOME发生时JVM正在做什么。

堆转储中是否有任何内容表明哪个线程触发了OOME?更具体地说,触发我的OOME的电话是做什么的?我意识到并理解,在内存泄漏的情况下,这可能会追逐错误的路径,但我想看看我是否看到哪个线程导致异常。

有没有使用MAT来看这个?

2 个答案:

答案 0 :(得分:1)

您是否检查过MAT中的线程概述? Thread Overview

它不会告诉你触发OOME的线程,但会提供有关保留堆的信息。

答案 1 :(得分:1)

我们并不真正关心哪个线程导致OOME,因为它不能证明什么,想想一个执行简单任务而没有泄漏的线程,如果堆已经接近满了这个线程创建一个小的Object它可能导致OOME而不是内存泄漏的根本原因。

关于您的实际问题,我不相信您可以知道哪个Thread从堆转储中导致OOME,唯一的方法是检查您的控制台或日志文件JVM将堆栈跟踪打印到OOME上的标准输出中。