G1新生代跨代引用

juejin.cn/post/702801...

什么是跨代引用?

在 G1 GC(以及其他分代 GC)中,堆被逻辑上分为:

  • 年轻代(Young Generation) :Eden + Survivor(S 区)
  • 老年代(Old Generation)

而在 G1 中,这两部分又进一步被拆分为多个 Region(区域),每个 Region 可能属于年轻代或老年代。

所谓的 跨代引用(Cross-Generational Reference) 就是:

老年代对象中,引用了年轻代对象。

为什么"跨代引用"是个问题?

垃圾回收时,Minor GC(或 Young Collection) 只扫描年轻代区域(Eden + Survivor)。

如果年轻代里有对象被老年代引用,那么这个对象必须保留(不能被错误地回收)。

问题在于:

  • 老年代对象太多;
  • 如果每次年轻代 GC 都去全量扫描老年代,会导致性能灾难。

G1 的解决方案

记忆集 & 卡表

cloud.tencent.com/developer/a...

记忆集是一种抽象概念,用于在实现部分垃圾收集(Partial GC)时用于记录从非收集区域指向收集区域的指针集合,卡表是记忆集的一种实现方式。例如在分代式GC中,通常能单独收集的只有Yong gen,那记忆集记录的就是Old gen指向Young gen的跨代指针。

在HotSpot中,采用卡表去实现记忆集。可以把记忆集和卡表的关系理解为Map跟HashMap。 一个卡页的内存中通常包含不止一个对象,只要卡页内有一个(或更多)对象的字段存在着跨代指针,那就将对应卡表的数组元素的值标识为1,成这个元素变脏(Dirty),没有则标识为0。在垃圾收集发生时,只要筛选出卡表中变脏的元素,就能轻易得出哪些卡页内存块中包含跨代指针,把他们加入GC Roots中一并扫描。

相关推荐
葫芦和十三5 小时前
图解 MongoDB 30|查询路由与广播查询:带片键定向,不带就广播
后端·mongodb·agent
葫芦和十三5 小时前
图解 MongoDB 29|分片键陷阱:jumbo chunk、孤儿文档和写入热点
后端·mongodb·agent
进击的程序猿~5 小时前
Go Zero源码阅读1
后端·golang
2601_961593426 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
犀利豆8 小时前
AI in Harness(三)
人工智能·后端
IT_陈寒9 小时前
Java的Stream.parallel()把我CPU跑爆了,这种优化要谨慎
前端·人工智能·后端
子兮曰10 小时前
Bun 重写为 Rust:11天、64个Claude、16.5万美元,一次改变行业认知的激进实验
前端·后端·bun
子兮曰10 小时前
Node.js v26.5.0 深度解读:import Text、流式 ReadableStreamTee、以及隐藏的安全加固浪潮
前端·后端·node.js
子兮曰10 小时前
TypeScript 7.0 RC 深度解读:Go 重写完成,10 倍提速,编译器的「奇点时刻」
前端·后端·typescript
kosan10 小时前
.NET/C# 实战:我如何把登录验证码从“裸奔”改到“铜墙铁壁”
后端