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 显示许多线程没有堆栈的主要内容,如果未能解决你的问题,请参考以下文章

eclipse debug 多线程

Eclipse MAT 线程属性

Windbg 堆栈跟踪问题

如何找到导致cpu飙高的线程堆栈信息

由“Qt程序运行一段时间后崩溃”引发的“opancv库中Mat::clone()函数”在多线程下的注意事项

Eclipse 不会在断点处停止并将线程状态置于运行中:用户请求