1

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

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

我正在尝试通读堆转储以找出导致我的 OOME 的确切原因。我看到消耗了大块内存,但它们在某种程度上是意料之中的。我目前正在寻找的是“确凿证据”。

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

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

反正有没有用MAT来看到这个?

4

2 回答 2

1

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

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

于 2016-06-07T14:22:02.230 回答
1

我们实际上并不关心哪个线程导致了,OOME因为它不会证明任何事情,考虑一个线程执行一个没有泄漏的简单任务,如果堆已经快满并且这个线程创建一个很小的Object它可能导致OOME没有是内存泄漏的根本原因。

关于您的实际问题,我不相信您可以知道Thread导致OOME堆转储的原因,唯一的方法是检查您的控制台或日志文件,因为 JVM 将堆栈跟踪打印到OOME.

于 2016-06-07T14:36:36.960 回答