我正在调查hprof
VisualVM中的文件
服务器正在运行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
免责声明:未来的猜测,我没有明确的答案,但我也许可以给出一些有用的提示。
我最近也看到过类似的情况(尽管使用的是更新的 Java 版本)。
大量未引用的原因int[]
似乎是某种映射缓冲区(我不是 NIO 专家,但似乎与此有关)。
得出此结论的原因是内存中存在数量非常相似byte[]
且大小几乎相同的周围,并且这些周围byte[]
被某些实例引用*Channel
。
所以我的猜测是,这些int[]
实际上是合成byte[]
实例,它们实际上与(正确引用的)共享内存。简而言之:它们是转移注意力的东西。
所有这些都是大量的猜测,我从未跟进过,因为当时的实际问题证明是完全无关的。