ZGC:如何通过颜色指针实现高效并发清理

浅萱吖_9500

浅萱吖_9500

2026-06-14

124人浏览

原创

zgc通过将对象状态编码进64位指针高4位实现并发清理,无需stw遍历对象头;marked0/marked1支持三色标记,remapped标识重定位,配合读屏障按需修正引用,停顿仅限初始标记和最终重映射。

zgc:如何通过颜色指针实现高效并发清理

ZGC 通过把对象状态“塞进指针本身”,绕开了传统 GC 对象头读写和全局同步的瓶颈,从而实现真正意义上的并发清理。它不依赖暂停线程来统一刷新状态,而是让每个指针自带“身份标签”,配合读屏障按需响应,整个过程对应用线程几乎无感。

颜色指针怎么存状态?

ZGC 在 64 位指针中预留若干高位(JDK 15+ 常用 4 位)作为元数据区,不改变实际地址有效位的前提下,编码对象生命周期阶段。典型布局包括:

  • Marked0 / Marked1:标记阶段用的双色位,支持三色标记(白→灰→黑)的并发迭代,避免漏标
  • Remapped:表示该指针已指向重定位后的新地址,用于区分“旧引用”和“新位置”
  • Finalizable(部分版本):标识需执行 finalize 的对象,隔离处理逻辑

这些位不是额外内存开销,而是直接复用指针空闲位——地址空间足够大(如支持 4TB 堆),高位冗余可安全借用。

颜色如何驱动并发清理?

颜色不是静态标签,而是一套状态机,随 GC 阶段自动流转:

XiaoHu.AI
XiaoHu.AI

一款AI工具,主要用于由小互建立的一个AI资讯、教程、课程、工具以及开源项目案例的平台,适合需要提升相关任务效率的用户。

下载
  • 初始时所有指针为 Remapped(视图干净,指向原始地址)
  • 进入标记阶段,新分配对象或被访问的存活对象指针转为 Marked0;标记线程与应用线程并发更新,无需锁
  • 标记完成进入转移(整理)阶段,ZGC 并行复制存活对象到新页,并将对应指针的 Remapped 位置 1,同时保留旧地址映射(靠虚拟内存多重映射实现)
  • 读屏障检测到指针是 Marked0/Marked1 但尚未 Remapped,就触发“重定向”:原子更新指针指向新地址,并返回正确值

整个过程没有全局遍历、不修改对象头、不阻塞写操作——清理动作分散在每次读取中完成。

为什么能避免 STW?

关键在于“状态下沉 + 按需修正”:

  • 传统 GC 要 STW 是因为必须冻结所有线程,统一扫描对象图并修正引用;ZGC 把这个修正动作拆解到每一次 load 操作里,由读屏障即时完成
  • 对象移动时,物理内存复制由 GC 线程异步进行,应用线程继续运行;只要读屏障能识别出“该指针还没重映射”,就帮它跳转一次,后续再读就是稳定的新地址
  • 唯一需要 STW 的环节极短:仅初始标记(找根集)和最终重映射(批量刷新剩余旧引用),通常控制在

它本质上把“集中式修正”变成了“分布式懒更新”,代价是每次读多一次位判断和可能的一次指针修正——但现代 CPU 流水线对此优化极好,实测开销可控。

相关文章

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

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

下载

相关标签:

java垃圾回收

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

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

339

31

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

0

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

0

18

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

2026.10.15

0

20

VS Code 怎么配置开发环境
VS Code 怎么配置开发环境

VS Code开发环境专题汇集编辑器安装、语言扩展、编译器、解释器、终端和调试配置文章,覆盖Java、Python、C++和PHP等常见语言的入门设置。

2026.10.15

0

18

C++ 开发环境怎么搭建
C++ 开发环境怎么搭建

C++开发环境专题汇集Windows、Linux下的编译器与IDE安装配置教程,涵盖GCC、Clang、Visual Studio、CLion和VS Code,以及编译运行首个程序的步骤。

2026.10.15

0

19

Python 虚拟环境是什么
Python 虚拟环境是什么

Python虚拟环境专题介绍项目依赖隔离的作用,汇集venv与uv创建、激活、退出及解释器切换的相关文章,并覆盖Windows、Linux和VS Code中的常见配置问题。

2026.10.15

0

15

Python 怎么安装并配置环境变量
Python 怎么安装并配置环境变量

Python安装与环境变量配置专题汇集Windows、macOS和Linux的安装步骤、PATH设置、pip配置及常见报错排查文章,帮助完成解释器安装并验证命令行可以正常运行。

2026.10.15

0

15

PHP 连接 MySQL 失败怎么办
PHP 连接 MySQL 失败怎么办

PHP连接MySQL失败专题汇集PDO与MySQLi扩展配置、账号权限、主机端口、套接字和认证方式等排查文章,覆盖连接报错、密码变更与容器环境配置,帮助按错误提示定位原因并修复。

2026.10.15

0

18

热门下载

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

精品课程

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

共6课时 | 54.7万人学习

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

共89课时 | 133.7万人学习