java - Eclipse MAT 显示许多线程没有堆栈

标签 java memory-leaks eclipse-memory-analyzer eclipse-mat

我的代码中存在泄漏,并且我正在使用出色的 Eclipse 内存分析器工具查看内存转储。

使用Thread_Overview,我可以看到我有太多线程。然而,只有少数显示堆栈。其中大部分(可能是我的泄漏)显示状态为 2(已阻止),但没有堆栈。

知道转储中没有堆栈时意味着什么吗?也许线程已经死了,但引用仍然保留在内存中(即泄漏)?

(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时,表示线程已终止。

关于java - Eclipse MAT 显示许多线程没有堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575488/

相关文章:

eclipse - 如何使用 Eclipse Memory Analyzer Tool 从正在运行的进程中转储堆?

java - 生成的没有 setter 的 Web 服务客户端类

java - Hibernate 在后续查询中使用初始 WHERE 子句

java - 将对象添加到指定索引处的 ArrayList

c - Valgrind 中是否需要处理仍然可达的内存?

java - 当内存分析器(MAT)中有许多定义的类和实例数时,这意味着什么?

java - 为什么我会收到 OutOfMemoryError 但堆转储显示大量可用内存

JavaFX:更改以编程方式创建的按钮值的方法

android - 泄漏在 xaml 中加载的自定义 View

c++ - 赋值运算符中的内存泄漏