hprof中"没有引用"的对象

Jos*_*seK 5 jvm visualvm

我正在调查hprofVisualVM中的文件

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

hprof显示由56000个实例占用的堆的71%,int[]并且当在VisualVM中查看时,这些56K阵列中没有一个具有引用

按照我们的说法,如果没有"参考",这应该是垃圾收集.所以问题是:

a)有没有办法找出这些参考文献?

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

c)我们应该在VisualVM中查看"保留大小"对象吗?

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

Joa*_*uer 2

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

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

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

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

所以我的猜测是,这些int[]实际上是合成byte[]实例,它们实际上与(正确引用的)共享内存。简而言之:它们是转移注意力的东西。

所有这些都是大量的猜测,我从未跟进过,因为当时的实际问题证明是完全无关的。