【问题标题】: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 时,表示线程已终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 2011-06-23
      • 2018-03-18
      • 2015-09-08
      • 2018-07-02
      • 1970-01-01
      相关资源
      最近更新 更多