JVM中Shenandoah收集器如何实现并发阶段的流式内存整理与低停顿

酷萱大大_7485

酷萱大大_7485

2026-07-07

157人浏览

原创

shenandoah 通过 brooks 转发指针与读写屏障实现并发整理,仅四次亚毫秒 stw,解耦对象移动与引用更新,用连接矩阵替代卡表,支持大堆低停顿内存管理。

jvm中shenandoah收集器如何实现并发阶段的流式内存整理与低停顿

Shenandoah 实现并发流式内存整理与低停顿,核心在于把“移动对象”和“更新引用”这两件事彻底解耦,并全部推向并发执行——它不等所有线程停下来再统一搬数据、改指针,而是让 GC 线程边搬边记,让用户线程边跑边自动跳转。

靠转发指针实现对象访问的实时重定向

每个对象头里嵌入一个 Brooks 转发指针(fwdptr),初始指向自身。一旦该对象被选入回收集,GC 线程就在目标 Region 复制新副本,然后原子更新原对象头中的 fwdptr 指向新地址。

  • 用户线程每次读取对象前,JVM 通过读屏障检查 fwdptr;若已设置,就直接跳转到新位置,无需等待全局引用更新
  • 写操作同样受读屏障拦截,确保字段修改落在新副本上,旧内存保持只读直至确认无访问
  • 对象迁移过程对应用完全透明,不存在“访问到一半被挪走”的风险

分阶段处理引用更新,避免全局扫描

传统整理必须 STW 扫全堆+全栈来修正所有旧地址引用,而 Shenandoah 把引用更新拆成三块:

Supermeme
Supermeme

Supermeme是一款通过文字生成梗图并搜索模板的 AI Meme 创作工具。

下载
  • 初始引用更新(STW):仅处理 GC Roots(如 Java 栈帧、静态变量、JNI 引用),耗时通常低于 0.1ms
  • 并发引用更新:GC 线程按物理地址顺序遍历堆中引用字段,批量将仍指向旧地址的引用改为新地址——这是优化项,非强制路径,即使跳过也不影响正确性
  • 最终引用更新(STW):极短收尾校验,修补并发过程中可能遗漏的少量根级引用

标记与回收全程并发,且不依赖堆大小

Shenandoah 的九个阶段中,只有四次亚毫秒级 STW(初始/最终标记、初始/最终引用更新),其余全部并发:

  • 并发标记基于 SATB 快照:在初始标记结束瞬间冻结引用关系视图,后续新增或修改引用不影响本轮结果
  • 并发回收阶段,GC 线程复制存活对象的同时更新 fwdptr,用户线程持续运行,读写均经屏障自动适配
  • 没有分代设计,不区分新生代老年代,所有 Region 统一参与整理,简化了跨代记忆集维护开销

连接矩阵替代卡表,降低元数据开销

为支持跨 Region 引用追踪,Shenandoah 用稀疏二维连接矩阵(Connection Matrix)代替 G1 的卡表(Remembered Set):

  • 矩阵行列表示 Region 编号,矩阵项为布尔值,表示“Region A 中的对象是否引用了 Region B 中的对象”
  • 空间占用更小,更新成本更低,尤其适合大堆场景下频繁的跨区引用探测
  • 配合读/写屏障,能快速定位需扫描的 Region 对,提升并发标记与回收效率

相关文章

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

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

下载

相关标签:

jvm垃圾回收

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

相关专题

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

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

2026.10.08

0

20

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

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

2026.09.30

120

10

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

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

2026.09.30

100

14

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

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

2026.09.30

80

12

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

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

2026.09.30

80

26

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

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

2026.09.29

100

15

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

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

2026.09.23

300

15

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

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

2026.09.23

180

15

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

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

2026.09.23

140

15

热门下载

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

精品课程

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

共6课时 | 54.6万人学习

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

共89课时 | 133.4万人学习