我的代码漏了,而且我有一个内存转储,我正在查看令人敬畏的Eclipse Memory Analyzer工具。
使用Thread_Overview,我可以看到我有太多的线程。但是,只有少数显示堆栈。其中大部分(可能是我的泄漏)显示状态为2(已阻止),但没有堆栈。
知道转储中没有堆栈时它意味着什么?也许线程已经死了,但引用仍然保留在内存中(即泄漏)?
(Windows 2K上的Java 6,如果有任何区别的话)
答案 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时,表示该帖子已被终止。