首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java堆转储是否包含线程堆栈

Java堆转储是否包含线程堆栈
EN

Stack Overflow用户
提问于 2010-09-09 00:27:27
回答 4查看 9K关注 0票数 15

我一直在使用Eclipse Memory Analysis工具检查堆转储。我没有见过任何对象通过线程堆栈中的局部变量保持活动状态的情况。

Java线程栈是否保存在堆转储中?如果不是,这些对象是否在转储中被算作不可访问的对象?如果是这样,有没有办法保留线程堆栈,以便将未收集的垃圾与本地变量值区分开来?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-10 22:19:55

来自更新的JVM的堆转储(从2010年开始)包括线程堆栈。Eclipse Memory Analyzer 0.8 (2010年1月发布)包含了对提取这些信息的支持:http://www.eclipse.org/mat/0.8/noteworthy.html

票数 14
EN

Stack Overflow用户

发布于 2010-09-09 17:02:38

堆栈跟踪不会保留,但堆栈中的对象引用会保留。

代码语言:javascript
运行
复制
SELECT DISTINCT * FROM OBJECTS ( SELECT OBJECTS
${snapshot}.getOutboundReferentIds(thread.getObjectId())
FROM INSTANCEOF java.lang.Thread thread )

这个OQL查询选择Java线程引用的所有对象(java.lang.Thread和子类)。该集合包括所有Java局部变量以及Java线程实例引用的任何其他对象。

票数 8
EN

Stack Overflow用户

发布于 2010-09-09 00:58:15

不,线程堆栈与堆转储是分开的。

你是怎么做堆转储的?jmap?如果是,则默认情况下为only live objects are dumped。这意味着您不会看到无法访问的对象。听起来你好像是有内存泄漏之类的。我建议使用JVisualVM或更复杂的分析器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3669858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档