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

mch*_*chr 14 java

我一直在使用Eclipse内存分析工具来检查堆转储.我还没有看到任何一个对象通过线程堆栈中的局部变量保持活动的情况.

堆转储中是否保留了java线程堆栈?如果没有,这些对象是否被计为转储中无法访问的对象?如果是这样,有没有办法保留线程堆栈,以便可以将未收集的垃圾与局部变量值区分开来?

mch*_*chr 12

来自最近的JVM(截至2010年)的堆转储包括Thread Stacks.Eclipse Memory Analyzer 0.8(2010年1月发布)包括对提取此信息的支持:http://www.eclipse.org/mat/0.8/noteworthy.html


mch*_*chr 6

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

SELECT DISTINCT * FROM OBJECTS ( SELECT OBJECTS
${snapshot}.getOutboundReferentIds(thread.getObjectId())
FROM INSTANCEOF java.lang.Thread thread )
Run Code Online (Sandbox Code Playgroud)

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