Eclipse MAT显示许多线程没有堆栈

时间:2015-11-06 20:50:25

标签: java memory-leaks eclipse-memory-analyzer eclipse-mat

我的代码漏了,而且我有一个内存转储,我正在查看令人敬畏的Eclipse Memory Analyzer工具。

使用Thread_Overview,我可以看到我有太多的线程。但是,只有少数显示堆栈。其中大部分(可能是我的泄漏)显示状态为2(已阻止),但没有堆栈。

知道转储中没有堆栈时它意味着什么?也许线程已经死了,但引用仍然保留在内存中(即泄漏)?

(Windows 2K上的Java 6,如果有任何区别的话)

1 个答案:

答案 0 :(得分:1)

表示线程已终止。这就是没有堆叠的原因。

让我感到震惊的是:2的状态未被阻止,但终止了。这是因为字段threadStatus是由sun.misc.VM.toThreadState()解码的位字段。我认为threadStatus是线程状态枚举,但它不是。你必须阅读该方法才能看到真实状态。在Windows上,它是这样的:

public static Thread.State toThreadState(int paramInt)
{
 if ((paramInt & 0x4) != 0)
   return Thread.State.RUNNABLE;
 if ((paramInt & 0x400) != 0)
   return Thread.State.BLOCKED;
 if ((paramInt & 0x10) != 0)
   return Thread.State.WAITING;
 if ((paramInt & 0x20) != 0)
   return Thread.State.TIMED_WAITING;
 if ((paramInt & 0x2) != 0)
   return Thread.State.TERMINATED;
 if ((paramInt & 0x1) == 0) {
   return Thread.State.NEW;
 }
 return Thread.State.RUNNABLE;
}

因此,当threadStatus为2时,表示该帖子已被终止。