内存分配失败(Allocation Failure):当新生代 Eden 区满了但 Survivor 区也无法承载时,分配流程如何流转

陌明同学_5352

陌明同学_5352

2026-05-05

788人浏览

原创

分配担保机制在survivor区不足时将存活对象直接晋升老年代。当eden满触发minor gc,若to区空间不够、对象年龄达阈值或survivor持续紧张,jvm检查老年代最大连续空闲空间是否足够;不足且未开启handlepromotionfailure则触发full gc,仍不足才oom。

内存分配失败(allocation failure):当新生代 eden 区满了但 survivor 区也无法承载时,分配流程如何流转

当 Eden 区满、一次 Minor GC 后 Survivor 区仍无法容纳存活对象时,JVM 会启动分配担保机制(Allocation Guarantee),把部分或全部存活对象直接晋升到老年代,而不是强求留在新生代。

Eden 满触发 Minor GC,但 Survivor 空间不足

Minor GC 发生时,JVM 扫描 Eden + 一个 Survivor(From),将存活对象复制到另一个 Survivor(To)。但如果:

  • Survivor To 区空间不够放下所有存活对象;
  • 或者某个对象年龄已达晋升阈值(默认 15);
  • 或者 Survivor 区连续多次 GC 后剩余空间持续紧张;

这时 JVM 不会卡住或抛出 OOM,而是动态启用分配担保:检查老年代是否有足够连续空间容纳这些“挤不进 Survivor”的对象。

分配担保如何判断是否能成功

判断依据不是“老年代总空间”,而是“老年代最大可用连续空间”:

  • 若老年代空闲连续内存 ≥ 待晋升对象总大小,直接晋升,Minor GC 正常完成;
  • 若老年代连续空间不足,且未开启 -XX:+HandlePromotionFailure(JDK 7 及以前默认开启,JDK 8+ 默认关闭),则触发 Full GC 尝试腾出空间;
  • 若 Full GC 后仍不满足,才真正抛出 java.lang.OutOfMemoryError: GC overhead limit exceeded 或 Java heap space。

常见诱因与调优提示

这类 Allocation Failure 往往不是单次事件,而是持续压力的表现:

  • SurvivorRatio 设置过小:比如 -XX:SurvivorRatio=2 导致 Survivor 区仅占新生代 1/4,容易快速溢出;建议保持默认 8(即 Eden : S0 : S1 = 8:1:1)或按压测结果微调;
  • 对象平均寿命偏长:大量对象熬过多次 GC 仍存活,不断向 Survivor 施压,可结合 -XX:MaxTenuringThreshold 和 GC 日志分析对象年龄分布;
  • 新生代过小或对象创建速率过高:Eden 频繁打满 → Minor GC 频繁 → Survivor 来不及清理 → 担保失败风险上升;应监控 GC throughput 和 promotion rate(晋升速率);

关键日志识别方式

在开启 -XX:+PrintGCDetails 后,看到类似输出即表明触发了担保流程:

[GC (Allocation Failure) [PSYoungGen: 917504K->0K(917504K)] [ParOldGen: 18440K->18440K(1048576K)] 935944K->18440K(1966080K), [Metaspace: ...]

注意括号中的 Allocation Failure,它代表本次 GC 的触发原因是 Eden 分配失败,而非定时或阈值驱动;后续若出现 PSYoungGen: xxxK->0K 但老年代使用量明显上升,说明对象已成功担保晋升。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
location.assign
location.assign

在前端开发中,我们经常需要使用JavaScript来控制页面的跳转和数据的传递。location.assign就是JavaScript中常用的一个跳转方法。通过location.assign,我们可以在当前窗口或者iframe中加载一个新的URL地址,并且可以保存旧页面的历史记录。php中文网为大家带来了location.assign的相关知识、以及相关文章等内容,供大家免费下载使用。

2023.06.27

2362

5

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

40

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

20

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

20

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

20

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

240

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

140

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

120

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程