-XX:+HeapDumpOnOutOfMemoryError 参数会在 JVM 发生以下 OutOfMemoryError(OOM) 错误时自动生成堆转储文件(Heap Dump),便于后续分析内存溢出原因:
一、触发转储的 OOM 错误类型
Java 堆溢出(Java Heap Space)
当对象数量超过堆容量限制时触发,典型错误信息:
java.lang.OutOfMemoryError: Java heap space
原因:内存泄漏或堆内存配置不足(如 -Xmx 过小)。
元空间溢出(Metaspace)
类元数据(如加载的类信息)超过元空间容量时触发,典型错误信息:
java.lang.OutOfMemoryError: Metaspace
原因:动态生成大量类(如反射、CGLIB)或 -XX:MaxMetaspaceSize 配置过小。
GC Overhead Limit Exceeded
当 JVM 花费超过 98% 的时间执行 GC 且仅回收不到 2% 的堆内存时触发,典型错误信息:
java.lang.OutOfMemoryError: GC overhead limit exceeded
原因:堆内存中存在大量无法回收的存活对象(如内存泄漏或对象生命周期过长)。
直接内存溢出(Direct Buffer Memory)
使用 NIO 直接内存(Direct ByteBuffer)超出限制时触发,典型错误信息:
java.lang.OutOfMemoryError: Direct buffer memory
原因:未合理释放直接内存或 -XX:MaxDirectMemorySize 配置不足。
无法创建新线程(Unable to Create New Native Thread)
系统线程数达到操作系统限制时触发,典型错误信息:
java.lang.OutOfMemoryError: unable to create new native thread
原因:线程池配置不合理或操作系统资源限制。
二、不触发转储的异常类型
栈溢出(StackOverflowError):由递归过深或方法调用链过长导致,不属于 OOM 错误。
本地内存溢出(Native Memory Exhaustion):由 JVM 自身或本地库(如 JNI)引发,可能不触发堆转储。
三、关键配置建议
启用堆转储:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof
辅助分析参数:
-Xmx 和 -Xms 设置合理堆大小。
-XX:MaxMetaspaceSize 限制元空间容量。
-XX:MaxDirectMemorySize 控制直接内存上限。
通过分析生成的堆转储文件(如使用 MAT 工具),可定位具体内存泄漏或配置问题。