Eclipse MAT 显示许多线程没有堆栈
Posted
技术标签:
【中文标题】Eclipse MAT 显示许多线程没有堆栈【英文标题】:Eclipse MAT shows no stack for many threads 【发布时间】:2015-11-06 20:50:24 【问题描述】:我的代码中存在泄漏,并且我正在使用出色的 Eclipse 内存分析器工具查看内存转储。
使用 Thread_Overview,我可以看到我有太多线程。但是,只有少数显示堆栈。其中大部分(可能是我的泄漏)显示状态为 2(BLOCKED),但没有堆栈。
知道转储中没有堆栈意味着什么吗?也许线程已经死了,但引用仍然保存在内存中(即泄漏)?
(如果有任何区别,Windows 2K 上的 Java 6)
【问题讨论】:
【参考方案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 时,表示线程已终止。
【讨论】:
以上是关于Eclipse MAT 显示许多线程没有堆栈的主要内容,如果未能解决你的问题,请参考以下文章