如何理解G1收集器将堆内存划分为Region区域的回收机制

酷墨同学_1936

酷墨同学_1936

2026-03-28

434人浏览

原创

G1收集器以动态角色可变的Region为回收单位,按需选择高垃圾占比Region进行Mixed GC。Region大小自动计算,避免手动设置过大或过小;Humongous Region专存大对象,RSet与写屏障保障跨区引用追踪,实现低延迟混合回收。

如何理解g1收集器将堆内存划分为region区域的回收机制

G1收集器的Region划分不是把堆“切块备用”,而是构建一种动态、按需调度的回收单位体系。它用大小相等但物理不连续的Region替代传统新生代/老年代的固定连续分区,让内存管理更灵活、回收更可控。

Region是角色可变的逻辑单元,不是静态分区

每个Region在任意时刻只承担一种角色:Eden、Survivor、Old 或 Humongous。这种角色不是写死的,而是随对象分配和GC过程动态变化。比如某次Young GC后,一个原本是Eden的Region可能变成Survivor;下一次它又可能被选为Old Region来存放晋升对象。Humongous Region则专用于存放≥50% Region大小的大对象,由连续多个Region组成,不参与复制算法,直接标记-清除。

关键点在于:Region之间没有物理连续性要求,也不强制绑定代际边界。这打破了CMS或Parallel GC中“新生代必须连着老年代”的限制,为混合回收打下基础。

回收以Region为最小粒度,优先处理“高价值”区域

G1不整代扫描,而是基于并发标记阶段统计出每个Region的垃圾占比(即“回收价值”)。Mixed GC启动后,它只挑选那些垃圾比例高、且存活对象少的老年代Region加入回收集合(Collection Set),同时一并回收所有Eden和Survivor Region。

这种策略依赖两个支撑机制:

  • Remembered Set(RSet):每个Region自带RSet,记录哪些其他Region有指向它的引用。回收时只需检查RSet,无需全堆扫描,大幅降低STW时间。
  • Card Table + Write Barrier:当发生跨Region引用写操作时,JVM通过写屏障标记对应卡页(card),后续再异步更新RSet,保证引用关系准确又不拖慢应用线程。

Mixed GC不是“老年代满了就收”,而是一套条件触发的闭环流程

Mixed GC不会单独出现,它必须走完完整的并发标记周期,并满足三个硬性条件才会启动:

  • 整个堆的占用率达到-XX:InitiatingHeapOccupancyPercent阈值(默认45%,注意是占总堆比例,不是老年代自身);
  • 并发标记已结束;
  • 堆中被判定为“无法回收的碎片”超过-XX:G1HeapWastePercent(默认5%)。

一旦触发,G1会分多次执行Mixed GC,每次控制暂停时间(由-XX:MaxGCPauseMillis软目标约束),逐步清理高价值Region,直到老年代空间压力缓解或达到预设回收上限。

Region大小不必手动调优,但要避开常见误区

Region默认大小由JVM根据堆总容量自动计算(目标约2048个Region),范围1MB–32MB且为2的幂。强行指定-XX:G1HeapRegionSize容易适得其反:

  • 设太小(如1MB)→ Region数量爆炸 → RSet元数据开销飙升,反而拖慢GC;
  • 设太大(如32MB)→ 单Region内对象生命周期差异大 → 回收效率下降,还可能加剧Humongous分配失败风险。

真正需要关注的是对象大小分布:避免频繁分配接近Region一半的大对象,防止Humongous Region堆积或因找不到连续空间而触发Full GC。

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

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

下载

相关标签:

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

相关专题

更多
DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

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

本专题梳理XORM框架的入门路径,从框架定位、依赖安装、连接数据库到跑通第一个增删改查示例,讲清Engine初始化、日志开启与项目目录规划,并对比GORM等同类ORM的差异,帮助Go开发者建立整体认知。

2026.11.04

0

15

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

20

18

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习