1

我一直在分析 java.lang.OutOfMemoryError: Java heap space for our service 并尝试通过 Eclipse MAT 工具挖掘堆转储。

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

以下是 JVM 命令行标志: -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 数组?

谢谢你的帮助

4

2 回答 2

0

以防万一有人最终在这里寻找:

java.lang.OutOfMemoryError:Java 堆空间

就像我一样:使用XX:+HeapDumpOnOutOfMemoryError很重要。我的代码意外创建了无限循环,并且在错误jmap -heap 使用没有显示任何错误,没有泄漏并且实际上堆使用率很低。另一方面,在 OOM 上自动完成的堆转储很大,并且清楚地显示(在 MAT 中)出了什么问题。

于 2018-12-04T10:05:57.010 回答
0

这听起来太小了,你确定你的内存不足不是因为 PermGen Space OOM 吗?当您在 OOM 发生后很晚手动生成转储文件时,生成的转储文件可能很小,但您的情况并非如此。

于 2016-03-10T00:43:30.163 回答