hprof(堆转储大小)比分配的堆小得多

时间:2015-09-16 21:14:45

标签: java out-of-memory heap hprof

我一直在分析java.lang.OutOfMemoryError:我们服务的Java堆空间,并尝试通过Eclipse MAT工具挖掘堆转储。

我们的服务使用8G堆运行,生成的堆转储大小仅为500 MB。

以下是JVM CommandLine标志:-XX:-DoEscapeAnalysis -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = / var / tmp -XX:InitialHeapSize = 8589934592 -XX:MaxGCPauseMillis = 10 -XX:MaxHeapSize = 8589934592 -XX: NewSize = 4294967296 -XX:OnOutOfMemoryError = / bin / kill -9%p -XX:+ PrintClassHistogram -XX:-PrintCommandLineFlags -XX:+ PrintGC -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:+ PrintTenuringDistribution -XX:SurvivorRatio = 8 -XX:+ UseCompressedClassPointers -XX:+ UseCompressedOops -XX:+ UseG1GC

堆转储大小:-rw ------- 1 taxadm amazon 557201181 Sep 16 15:10 java_pid4026.hprof

这是正确的堆转储吗?因为我们的服务极不可能尝试分配7.5 GB数组?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

这听起来太小了,你确定你的内存不足是由于PermGen Space OOM吗?在OOM发生之后手动生成转储文件时,生成的转储文件可能很小,但事实并非如此。

答案 1 :(得分:0)

以防万一有人最终在这里像我一样寻找“ java.lang.OutOfMemoryError:Java堆空间”:使用“ XX:+ HeapDumpOnOutOfMemoryError”很重要。我的代码意外创建了无限循环,并使用jmap -heap after 错误表明没有错误,没有泄漏和实际上堆使用率较低。另一方面,在OOM上自动完成的堆转储很大,并且清楚地(在MAT中显示)出了什么问题。