2

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

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

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

(如果有什么不同的话,Windows 2K 上的 Java 6)

4

1 回答 1

2

这意味着线程已终止。这就是为什么没有堆栈。

让我感到震惊的是: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;
}

因此,whenthreadStatus为 2,表示线程已终止。

于 2015-11-10T21:26:23.857 回答