jvm - hprof 中具有 "no references"的对象

标签 jvm visualvm

我正在调查 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/

相关文章:

linux - Linux 上的 JNI_CreateJavaVM 会破坏堆栈?

java - Hotspot JIT 编译器完成的任何指令重新排序是否可以重现?

java - HelloWorld 程序到 JVM 代码

java - Tomcat 私有(private) JVM

tomcat - Tomcat 中的 Alfresco : OutOfMemory

java - visualvm 对比 JProbe 对比 JProfiler

linux - 无法使用 visualvm 和相同的 tempdir 分析本地 tomcat

java - VisualVM - 无法进行堆转储

java - 如何使用 VisualVM 打开大型堆转储?

ssh - 通过 ssh 的 VisualVM