Eclipse的MAT没有显示出堆栈许多线程
问题描述:
我在我的代码泄漏,我已经得到了我期待在与真棒Eclipse的内存分析器工具内存转储。Eclipse的MAT没有显示出堆栈许多线程
使用Thread_Overview,我可以看到,我有太多的线程。但是,只有少数显示堆叠。其中大部分(可能是我的泄漏)显示状态2(BLOCKED),但没有堆栈。
任何想法,这是什么意思时,有垃圾堆里没有堆栈?也许这个线程已经死了,但是这个引用仍然保留在内存中(即泄漏)?
(在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,这意味着线程的终止。