为什么我看不到 GC 根?

Why can't I see GC roots?

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

不出所料,我很感兴趣谁在坚持这种愚蠢的事情,所以我右键单击 ArrayList 并打开 'Path to GC Roots'(包含所有引用或一些排除,它似乎没有有所作为)。

新选项卡打开并仅显示一行,即 ArrayList,并附加了后缀 'Unknown'。

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

涉及的内容的各种版本。

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

Eclipse 内存分析器:版本 1.5.0

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

看来堆转储不完整。我个人的理论是,由于内存不足,写出堆并不能完全可靠地工作。

我在应用程序正常工作时从应用程序创建了一个新的堆转储。果然还有另一个奇怪的 ArrayList 实例,其中包含由 NULL 字节组成的字符串。虽然它只有 10 个条目,并且只占堆的很小一部分。

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