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时,表示线程已终止。
我的代码有漏洞,我有一个内存转储,我正在使用很棒的 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时,表示线程已终止。