6

我正在调查hprofVisualVM 中的一个文件

服务器正在运行 JDK 1.4.2_30,并且有 1 GB 堆,NewSize 为 200 Mb。

hprof 显示 71% 的堆被 56000 个实例占用,int[]并且在 VisualVM 中查看时,这些 56K 数组都没有引用

按照我们的说法,如果“没有引用”,这应该被垃圾收集。所以问题是:

a) 有没有办法找出这些参考资料?

b) 这是一个不正确的快照 - 即进行堆转储的操作是否进行了某种 GC?

c) 我们是否应该查看 VisualVM 中的“保留大小”对象?

作为更新- 我们仍然不知道这些int[]是什么,但下一个最大的对象是 Pool 中的 Weblogic 内部 EJB 引用,我们发现其中一个不正确的设置已将内存利用率从早期频繁的 Full GC 降低到 30%

4

1 回答 1

2

免责声明:提前猜测,我没有明确的答案,但我也许可以提供一些有用的提示。

我最近看到了类似的情况(尽管使用的是更新的 Java 版本)。

大量未引用的原因int[] 似乎是某种映射缓冲区(我不是 NIO 专家,但似乎与此有关)。

得出这个结论的原因是,在内存中存在非常相似的数量,byte[]并且内存大小几乎相同,并且byte[]被某些*Channel实例引用。

所以我的猜测是(曾经)那些int[]实际上是合成byte[]实例,它们实际上与(正确引用)共享它们的内存。简而言之:它们是红鲱鱼。

所有这些都是很多猜测,我从来没有跟进,因为当时的实际问题结果证明是完全无关的。

于 2011-09-05T07:07:42.957 回答