JVM内存分配失败需按区域定位:堆区看Eden耗尽、晋升失败或大对象分配失败;元空间看类加载过多;栈内存看线程数与递归深度;直接内存看MaxDirectMemorySize限制。

排查 JVM 内存分配失败,核心是定位“为什么对象无法成功分配”——不是单纯看内存够不够,而是看目标区域是否满足分配条件(空间足够 + 连续可用 + 符合策略)。需结合内存结构分区、GC行为和日志线索交叉验证。
先确认失败发生在哪个内存区域
不同区域的分配失败表现和原因完全不同:
-
Java 堆(Heap):最常见,报错如
java.lang.OutOfMemoryError: Java heap space。需进一步区分是年轻代 Eden 耗尽(Minor GC 频繁但无效),还是老年代晋升失败(如Promotion failed)、或大对象直接分配失败(Eden 不够且老年代无连续空间)。 -
元空间(Metaspace):报错
OutOfMemoryError: Metaspace。说明加载类过多或单个类元数据过大(如动态生成大量代理类、反射调用频繁未卸载),与堆大小无关,要看-XX:MaxMetaspaceSize是否过小或类卸载机制未启用。 -
栈内存(Stack):报
StackOverflowError(深度超限)或OutOfMemoryError(线程数过多导致栈总占用超系统限制),和堆参数无关,需查线程数、递归深度、-Xss 设置。 -
直接内存(Direct Memory):使用
ByteBuffer.allocateDirect()时失败,报OutOfMemoryError: Direct buffer memory。受-XX:MaxDirectMemorySize控制,也受操作系统虚拟内存限制影响。
看 GC 日志锁定分配卡点
启用详细 GC 日志(-Xlog:gc*:file=gc.log:time,uptime,level,tags)后,重点关注三类线索:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
晋升失败提示:CMS 日志中出现
Promotion failed,G1 中出现To-space overflow,说明老年代/目标 Region 有空闲但不连续,是典型碎片问题。 - 回收效果异常:Full GC 后老年代使用率(OU)几乎不变(如 78% → 76%),说明对象被回收了,但空间没释放出来——大概率是碎片阻碍了压缩或整理。
-
分配拒绝记录:日志中明确出现
Allocation Failure并标注失败区域(如Eden space或Old space),配合前后内存水位可判断是真不足还是策略拦截(如 G1 的Humongous Allocation失败)。
用 jstat 和 jmap 定位对象分布瓶颈
命令行工具提供实时、低开销的内存快照:
-
jstat -gc:持续观察OU(老年代已用)、OC(老年代容量)、FGC(Full GC 次数)。若OU长期 >90% 且OC未满、FGC频次陡增,说明老年代被中小对象“钉住”,腾不出大块空间。 -
jmap -histo:live:重点看byte[]、char[]、HashMap$Node等实例数量和总大小。若大量 64KB–2MB 的缓存对象长期存活,它们就是制造老年代碎片的“楔子”。 -
jmap -heap:确认各代实际大小、使用率、GC 算法类型,核对启动参数是否生效(如 -Xmn 是否真分出了年轻代)。
结合 GC 算法特性反推根本原因
不同收集器对分配失败的容忍度和成因逻辑差异很大:
-
CMS:标记-清除不移动对象,天然易碎。若日志中频繁出现
Concurrent mode failure,且加了-XX:+UseCMSCompactAtFullCollection仍无效,说明碎片已严重到压缩都难凑效;可用-XX:+PrintFLSStatistics=2(JDK 8 及以前)看自由列表统计,空闲块数量暴增、平均大小骤降即为铁证。 -
G1:虽能混合回收压缩,但若
-XX:G1HeapRegionSize设得过大(如 4MB),小对象被迫挤进大 Region,内部浪费加剧;若 Mixed GC 触发太少,老年代 Region 碎片化升高,可调小-XX:G1MixedGCCountTarget加快整理节奏。 - ZGC/Shenandoah:并发移动对象,基本不产生碎片。若在这些收集器下仍遇分配失败,大概率是元空间、直接内存或堆外 Native 内存问题,而非堆内碎片。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










