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

Eclipse MAT shows no stack for many threads

我的代码有漏洞,我有一个内存转储,我正在使用很棒的 Eclipse 内存分析器工具查看它。

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

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

(Java 6 on Windows 2K 如果有区别的话)

表示线程已经终止。这就是为什么没有堆栈。

让我震惊的是: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时,表示线程已终止。