【发布时间】:2025-12-07 01:10:01
【问题描述】:
我的 Java 程序从流中读取数据,并为其中的一部分创建内存缓存。在某些时候它会抛出 OutOfMemoryError,我已经让它在那个时候创建一个堆转储,以便我可以看到导致问题的原因。 但是当我加载堆转储时,我发现大约有一半的内存没有使用:我使用 -Xmx8000m 启动了 VM,当加载到 Eclipse Memory Analyzer 或 VirtualVM 时,堆转储只显示大约 4GB 正在使用中。然而,转储文件本身的文件大小约为 8GB。
同样奇怪的是,这两个工具都将许多大小为 int[262136] 的 int 数组报告为“未引用对象”,即垃圾。其中大约有 4GB - 所以这确实表明它们不是垃圾,而是 OOM 的原因.. 顺便说一句,我的代码根本不会在这种大小的数组中创建。
为什么会出现这个OOM,那些int[]数组是怎么回事?
我在 Java 11 JDK 上运行,但同样的问题也出现在 Java 14 上。
【问题讨论】:
标签: java visualvm eclipse-memory-analyzer