全堆扫描逃避技巧:分析 G1 收集器是如何通过“Remembered Set”在不扫描整个老年代的情况下回收新生代的

梦浩君_7439

梦浩君_7439

2026-05-08

377人浏览

原创

g1收集器通过remembered set(rset)避免扫描整个老年代:rset是每个region维护的跨区引用账本,由写屏障实时更新,记录哪些老年代region引用了当前新生代region中的对象;minor gc时将rset中登记的外部region作为额外gc roots,仅据此标记存活对象,大幅缩减扫描范围。

全堆扫描逃避技巧:分析 g1 收集器是如何通过“remembered set”在不扫描整个老年代的情况下回收新生代的

G1 收集器不扫描整个老年代回收新生代,核心靠的是 Remembered Set(RSet) —— 它不是辅助手段,而是每个 Region 的“跨区引用账本”。只要老年代某个对象引用了当前新生代 Region 中的对象,这条引用就会被记录在该新生代 Region 对应的 RSet 里。

Remembered Set 是怎么建起来的?

RSet 不是靠扫描生成的,而是靠写屏障(Write Barrier)实时维护的:

  • 每当发生一次跨 Region 的引用写入(比如老年代 Region A 中的对象 obj.field = newInEden),JVM 在执行赋值前会触发写屏障;
  • 写屏障立即定位到被引用对象所在的 Region(这里是 Eden 区某 Region),并把“Region A → 这个 Eden Region”的关系登记进该 Eden Region 的 RSet;
  • RSet 内部通常用哈希表或位图实现,支持快速插入和查重,避免重复记录同一源 Region。

Minor GC 时 RSet 怎么用?

年轻代 GC(即 G1 的 Young GC)只处理 Eden 和 Survivor Region。此时流程是:

AionClaw
AionClaw

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

下载
  • 枚举 GC Roots(线程栈、本地变量、JNI 引用等);
  • 额外把所有待回收 Eden Region 的 RSet 中记录的“外部引用源”也加入 Roots 集合(例如:RSet 里存着 Region X、Y、Z,就把它们里面的存活对象当作 Roots 的一部分);
  • 然后仅从这些 Roots 出发,标记当前 Eden/Survivor 中的存活对象——完全不需要遍历老年代内存。

为什么 RSet 能保证不漏标?

关键在于写屏障的覆盖性和 RSet 的粒度控制:

  • 所有可能产生跨 Region 引用的写操作(包括数组元素赋值、对象字段赋值、volatile 写等)都会被写屏障拦截;
  • G1 的 RSet 按 Region 维护,比 CMS 的卡表(Card Table)更精细:卡表以 512 字节为单位标记“脏页”,而 RSet 直接记录“哪个 Region 引用了我”,省去后续解析脏页的开销;
  • 配合增量更新(如 G1 的 Dirty Card Queue + 并发 Refine 线程),RSet 可在后台持续刷新,避免 GC 时集中处理导致 STW 延长。

实际效果:RSet 让扫描范围从“整个老年代”压缩到“几十个 Region 头”

假设堆有 2048 个 Region,其中老年代占 1500 个。一次 Young GC 若需全扫老年代,要检查上亿字节;但启用 RSet 后,平均只需检查几十个 Region 的对象头(每个 Region 的 RSet 条目通常只有几个到几十个),GC 根集合大小下降 2–3 个数量级,STW 时间稳定在毫秒级。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5287

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2328

6

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

40

20

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

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

2026.09.30

140

10

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

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

2026.09.30

140

14

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

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

2026.09.30

100

12

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

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

2026.09.30

100

26

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

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

2026.09.29

120

15

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

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

2026.09.23

320

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
誉天教育RHCE视频教程
誉天教育RHCE视频教程

共9课时 | 1.7万人学习

尚观Linux RHCE视频教程(二)
尚观Linux RHCE视频教程(二)

共34课时 | 6.9万人学习

尚观RHCE视频教程(一)
尚观RHCE视频教程(一)

共28课时 | 5.9万人学习