hprof中“没有引用”的对象

时间:2011-09-05 06:51:10

标签: jvm visualvm

我正在调查VisualVM中的hprof文件

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

我最近看到过类似的情况('虽然有更新的Java版本)。

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

得出这个结论的原因是{em>非常相似的byte[]个数字,内存大小几乎相同,而byte[]引用了*Channel { {1}}个实例。

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

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