gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:48:39 24 4
gpt4 key购买 nike

我的代码中存在泄漏,并且我正在使用出色的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com