我正在调查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%
答案 0 :(得分:2)
免责声明:未来的猜测,我没有明确的答案,但我可以提供一些有用的提示。
我最近看到过类似的情况('虽然有更新的Java版本)。
大量未引用的int[]
的原因似乎已被映射到某种缓冲区(我不是NIO专家,但它似乎与此有关)。
得出这个结论的原因是{em>非常相似的byte[]
个数字,内存大小几乎相同,而byte[]
引用了*Channel
{ {1}}个实例。
所以我猜测那些int[]
实际上是合成的实例,它们实际上与byte[]
共享其内存( 适当引用)。简而言之:它们是红色的鲱鱼。
所有这些都是很多猜测,我从来没有跟进它,因为当时的实际问题结果是完全不相关的。