Java EclipseMat没有显示许多线程的堆栈

Java EclipseMat没有显示许多线程的堆栈,java,memory-leaks,eclipse-memory-analyzer,eclipse-mat,Java,Memory Leaks,Eclipse Memory Analyzer,Eclipse Mat,我的代码中有一个漏洞,我正在使用很棒的Eclipse内存分析器工具查看内存转储 使用Thread_概述,我可以看到我有太多的线程。然而,只有少数几个展示堆栈。其中大部分(可能是我的漏洞)显示状态为2(已阻止),但没有堆栈 知道垃圾堆里没有垃圾堆意味着什么吗?可能线程已死,但引用仍保留在内存中(即泄漏) (Windows 2K上的Java 6如果有任何区别)表示线程已终止。这就是为什么没有堆栈 让我吃惊的是:2的状态不是被阻止的,而是被终止的。这是因为字段threadStatus是一个位字段,由s

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

使用Thread_概述,我可以看到我有太多的线程。然而,只有少数几个展示堆栈。其中大部分(可能是我的漏洞)显示状态为2(已阻止),但没有堆栈

知道垃圾堆里没有垃圾堆意味着什么吗?可能线程已死,但引用仍保留在内存中(即泄漏)


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

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

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