3

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

不出所料,我很感兴趣谁在坚持这样一个愚蠢的事情,所以我右键单击 ArrayList 并打开“GC Roots 路径”(所有引用或排除,它似乎没有区别) .

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

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

涉及的各种版本的东西。

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

Eclipse 内存分析器:版本 1.5.0

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

4

1 回答 1

2

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

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

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

于 2015-07-14T13:28:11.547 回答