我一直在分析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数组?
感谢您的帮助
答案 0 :(得分:0)
这听起来太小了,你确定你的内存不足是由于PermGen Space OOM吗?在OOM发生之后手动生成转储文件时,生成的转储文件可能很小,但事实并非如此。
答案 1 :(得分:0)
以防万一有人最终在这里像我一样寻找“ java.lang.OutOfMemoryError:Java堆空间”:使用“ XX:+ HeapDumpOnOutOfMemoryError”很重要。我的代码意外创建了无限循环,并使用jmap -heap
after 错误表明没有错误,没有泄漏和实际上堆使用率较低。另一方面,在OOM上自动完成的堆转储很大,并且清楚地(在MAT中显示)出了什么问题。