JVM ZGC 收集器的着色指针技术解析

落磊小哥_2231

落磊小哥_2231

2026-07-08

873人浏览

原创

zgc通过将marked0/marked1/remapped/finalizable状态直接编码进64位指针高4位,结合虚拟内存多重映射与读屏障,实现并发标记与重映射,仅初始标记和最终重映射需stw。

jvm zgc 收集器的着色指针技术解析

ZGC 的着色指针(Colored Pointers)不是附加的元数据结构,而是把状态信息直接“塞进”64 位指针的高位里。它绕开了传统 GC 必须访问对象头或独立位图的开销,让每次状态判断变成一次位运算——纳秒级完成,且完全不依赖内存读取。

为什么非得把颜色塞进指针里?

传统 GC 要知道一个对象是否被标记、是否已转移,得去查对象头或全局位图。这不仅多一次内存访问,还容易引发缓存竞争和伪共享。ZGC 反过来想:既然指针本身要被加载,那干脆让它“自带身份”。只要应用线程一读引用,颜色位就自然暴露,无需额外动作。

  • Linux/x86-64 下,64 位虚拟地址实际只用前 46–48 位寻址(支持 64TB–256TB 物理内存),高位长期闲置
  • ZGC 拿出其中 4 位(42–45 位常见)编码四种状态:Marked0、Marked1、Remapped、Finalizable
  • 剩余高位保留,兼容未来扩展,也避免与内核地址空间冲突

四种颜色分别管什么?

这四个标志位不是随意定义的,各自承担明确的并发阶段职责:

Find Skills
Find Skills

一款AI工具,主要用于帮助用户在提出类似以下问题时发现并安装 Agent 技能:,适合需要提升相关任务效率的用户。

下载
  • Marked0 / Marked1:交替使用,用于三色标记中的“存活标记”。本轮用 Marked0,下轮自动切到 Marked1,天然规避标记翻转问题
  • Remapped:表示该指针已指向迁移后的新地址。读屏障靠它快速判断是否需要查转发表;未置位则说明仍指向旧位置,需按需修复
  • Finalizable:标识对象仅能通过 finalize() 访问,GC 可据此延迟回收,避免误清

颜色怎么“动”起来?靠内存多重映射

单纯改指针高位没用——操作系统会把它当非法地址拒绝访问。ZGC 底层用的是 Linux mmap 的虚拟内存技巧:

  • 将同一块物理内存,同时映射到三个不同虚拟地址段(如 0x00…、0x10…、0x20…)
  • 每个段对应一种“视图”:原始视图、标记视图、重映射视图
  • 修改指针高位,本质是切换访问哪个虚拟地址段,物理数据不动,但语义立刻变化

这就实现了“指针自愈”:旧指针读取时触发读屏障,屏障根据 Remapped 位决定跳转到哪个映射段,自动拿到新地址并更新指针值。

它如何消灭 STW?

着色指针本身不直接消除停顿,但它为“无锁并发”提供了基础设施:

  • 标记不用 STW 扫根:GC 线程从 Roots 开始遍历,靠 MarkedX 位跳过已标对象;应用线程访问对象时,读屏障顺手补标——标记是“摊在每一次读上”的
  • 重映射不用 STW 更新所有引用:只要指针带 Remapped=0 且对象已迁移,读屏障当场查表修正,后续访问就是干净新地址
  • 停顿只留给极轻量操作:初始标记 Roots、再标记弱引用、回收页面元数据——这些与堆大小无关,只跟线程栈深度、静态变量数等固定量有关

相关文章

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

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

下载

相关标签:

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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9957

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7102

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6252

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1084

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1316

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2609

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19951

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

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

精品课程

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