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