我一直在使用Eclipse Memory Analysis工具检查堆转储。我没有见过任何对象通过线程堆栈中的局部变量保持活动状态的情况。
Java线程栈是否保存在堆转储中?如果不是,这些对象是否在转储中被算作不可访问的对象?如果是这样,有没有办法保留线程堆栈,以便将未收集的垃圾与本地变量值区分开来?
发布于 2012-08-10 22:19:55
是
来自更新的JVM的堆转储(从2010年开始)包括线程堆栈。Eclipse Memory Analyzer 0.8 (2010年1月发布)包含了对提取这些信息的支持:http://www.eclipse.org/mat/0.8/noteworthy.html
发布于 2010-09-09 17:02:38
堆栈跟踪不会保留,但堆栈中的对象引用会保留。
SELECT DISTINCT * FROM OBJECTS ( SELECT OBJECTS
${snapshot}.getOutboundReferentIds(thread.getObjectId())
FROM INSTANCEOF java.lang.Thread thread )这个OQL查询选择Java线程引用的所有对象(java.lang.Thread和子类)。该集合包括所有Java局部变量以及Java线程实例引用的任何其他对象。
发布于 2010-09-09 00:58:15
不,线程堆栈与堆转储是分开的。
你是怎么做堆转储的?jmap?如果是,则默认情况下为only live objects are dumped。这意味着您不会看到无法访问的对象。听起来你好像是有内存泄漏之类的。我建议使用JVisualVM或更复杂的分析器。
https://stackoverflow.com/questions/3669858
复制相似问题