Jvm 带“的对象”;“无参考资料”;在hprof中

Jvm 带“的对象”;“无参考资料”;在hprof中,jvm,visualvm,Jvm,Visualvm,我正在调查VisualVM中的hprof文件 服务器运行的是JDK1.4.2_30,具有1 GB堆,新闻大小为200 Mb hprof显示了56000个int[]实例占用的堆的71%,在VisualVM中查看时,这些56K数组中没有一个具有引用 按照我们的说法,如果“没有参考资料”,这应该是垃圾收集。 因此,问题是: a) 有没有办法找到这些参考资料 b) 这是一个不正确的快照吗?例如,进行堆转储的操作是否进行了某种GC c) 我们应该看看VisualVM中的“保留大小”对象吗 作为更新-我们仍

我正在调查VisualVM中的
hprof
文件

服务器运行的是JDK1.4.2_30,具有1 GB堆,新闻大小为200 Mb

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

按照我们的说法,如果“没有参考资料”,这应该是垃圾收集。 因此,问题是:

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

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

c) 我们应该看看VisualVM中的“保留大小”对象吗

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

免责声明:提前猜测,我没有一个明确的答案,但我可能会给出一些有用的提示

我最近也看到过类似的情况(尽管Java版本更为流行)

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

得出这一结论的原因是,内存中大小几乎相同的
字节[]
数量非常相似,而那些
字节[]
被一些
*通道
实例引用

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


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

@Tomas:我不知道你是不是在针对我,但(据我记忆,已经有一段时间了)我只是从VisualVM中创建了一个堆转储。@Joachim我很抱歉,这个问题应该向约瑟克提出。这看起来很奇怪。你是怎么得到heapdump hprof文件的?我明白了。有时堆转储包含没有引用的实例。您确定int[]的56000个实例都没有引用吗?您使用哪个版本的VisualVM?kill-3在执行堆转储之前调用GC。@托马斯:您是对的,其中一些确实有引用。我们没有挖那么远。VisualVM 1.3.2通常情况下,堆上的某些对象没有引用。如果你愿意,我可以看看,但我需要你的堆转储。