我正在调查 hprof
VisualVM 中的文件
该服务器运行 JDK 1.4.2_30 并具有 1 GB 堆,NewSize 为 200 Mb。
hprof 显示 71% 的堆被 int[]
的 56000 个实例占用在 VisualVM 中查看时,这些 56K 数组都没有引用
按照我们的说法,如果“没有引用”,这应该被垃圾收集。
所以问题是:
a) 有没有办法找出这些引用文献?
b) 这是一个不正确的快照 - 即进行堆转储的操作是否进行了某种 GC ?
c) 我们应该查看 VisualVM 中的“保留大小”对象吗?
作为更新 - 我们仍然不知道这些是什么int[]
是,但下一个最大的对象是池中的 Weblogic 内部 EJB 引用,我们发现其中一个设置不正确,导致内存利用率从早期频繁的 Full GC 降低到 30%
最佳答案
免责声明:前面的猜测,我没有明确的答案,但我可能会给出一些有用的提示。
我最近看到了类似的情况('虽然有更新的 Java 版本)。
大量未引用的原因int[]
似乎已经映射了某种类型的缓冲区(我不是 NIO 专家,但似乎与此有关)。
得出这个结论的原因是byte[]
的数量非常相似。内存中的大小几乎相同 byte[]
被一些 *Channel
引用实例。
所以我的猜测是(是)那些 int[]
实际上是合成实例,它们实际上与 byte[]
共享它们的内存(正确引用)。简而言之:他们是红鲱鱼。
所有这些都是很多猜测,我从来没有跟进过,因为当时的实际问题原来是完全不相关的。
关于jvm - hprof 中具有 "no references"的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7304665/