为什么我看不到GC的根源?

时间:2015-07-13 14:15:12

标签: java heap-dump eclipse-memory-analyzer

我有一个与OutOfMemory崩溃的应用程序。我将崩溃的phd文件加载到Eclipse Memory Analyzer中。我迅速找到了一个相当可疑的ArrayList,其中包含大约5,700,000个条目,每个条目都是一个内容为16个空字节的字符串(????)。注意:我没有检查所有条目,但检查了一些较小的样本。

不出所料我感兴趣的是谁坚持这样一个愚蠢的事情,所以我右键点击了ArrayList并打开了“GC Roots的路径”(包括所有引用或有一些排除,它似乎没有差异)。

将打开一个新选项卡,仅显示一行ArrayList,并附加后缀“Unknown”。

所以我的问题在标题中:为什么我看不到GC根源?

涉及各种版本的内容。

应用程序在某些1.6 IBM JRE上的Websphere 8.x上运行

Eclipse Memory Analyzer:版本1.5.0

Java诊断工具框架(用于加载IBM转储):1.10.0.201211161052

1 个答案:

答案 0 :(得分:1)

看起来堆转储只是不完整。我个人的理论是,由于缺乏记忆,写出堆不能完全可靠。

我在应用程序运行正常时创建了一个新的heapdump。果然有另一个奇怪的ArrayList实例,其中包含由NULL-Bytes组成的字符串。它虽然只有10个条目,但只占了Heap的一小部分。

该ArrayList有两条通过com.ibm.ws.security.core.WSAccessManager到GC-Root“System Class”的路径,另一条通过com.ibm.ws.security.util.MultiDomainHelper。对于第一个,我发现了一个可能与之相关的错误:http://www-01.ibm.com/support/docview.wss?uid=swg1PI33412