You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JVM未用尽594M堆内存却触发Java堆内存不足错误求助

G1 GC下堆内存未耗尽却抛出OutOfMemoryError的原因分析
  • Region级内存碎片与大对象分配失败
    G1将堆划分为若干固定大小的Region,当分配大对象(大小超过单个Region的一半)时,需要连续的Humongous Region空间。如果堆中剩余的连续内存不足以容纳该对象,哪怕总剩余空间(如你看到的351M)远大于对象大小,也会直接抛出OutOfMemoryError: Java heap space——这是内存碎片导致的连续空间不足,而非总堆内存耗尽。

  • GC完成后的即时内存耗尽
    日志里的“最后一次GC后仅使用351M”是GC执行完毕时的状态,但在GC结束到OOM抛出的间隙,应用线程可能已经执行了大量对象分配操作。比如批量加载数据、创建临时对象等场景,会瞬间耗尽剩余的243M可用内存,触发OOM。此时GC日志的内存状态和OOM发生时的实际状态存在时间差。

  • 分区内存耗尽而非总堆耗尽
    G1堆分为Young、Old、Humongous等逻辑分区,总剩余空间充足不代表目标分区有可用空间:

    • Survivor区已满,且Young区存活对象无法晋升到Old区(Old区无剩余空间),会因Young区无法扩容触发OOM;
    • Old区已耗尽,新晋升对象无法进入,同样会导致OOM,此时总堆剩余空间可能集中在Young区,无法被Old区利用。
  • 并发标记阶段的内存竞争
    G1并发标记过程中,应用线程仍在持续分配对象。如果并发标记速度跟不上对象分配速度,或标记完成前堆内存已接近耗尽,G1可能来不及触发Full GC就抛出OOM。此时日志中的最后一次GC可能是并发GC,其剩余内存状态无法反映后续的内存消耗情况。

内容的提问来源于stack exchange,提问作者SLY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:25:30