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,这意味着线程的终止。