标记-整理算法:如何处理大量的对象移动操作

云强吖_9519

云强吖_9519

2026-07-04

237人浏览

原创

标记-整理算法核心是可控有序批量移动存活对象并更新引用:先从gc roots精准标记所有可达对象,再按地址顺序滑动压缩至堆一端,保持局部性且单次遍历计算新地址,最后集中修正引用,兼顾碎片消除与开销控制。

标记-整理算法:如何处理大量的对象移动操作

标记-整理算法处理大量对象移动时,核心不是“避免移动”,而是用可控、有序、批量的方式完成移动,同时确保引用一致性。它不追求零开销,而是通过结构化步骤把移动成本控制在可接受范围内。

移动前先精准标记存活对象

移动操作只作用于真正存活的对象,避免无效搬运。标记阶段从 GC Roots(如栈变量、静态字段、JNI 引用)出发,递归遍历所有可达对象并打标。大对象、小对象、长期存活对象一视同仁,只要可达就进入移动队列。这一步直接决定了后续移动的范围——标记越准,移动越少;若漏标,会导致对象被误回收;若错标,则徒增移动负担。

按地址顺序紧凑滑动,不打乱相对位置

整理阶段采用“滑动式”(sliding compaction),而非随机重排。JVM 将所有已标记对象按原始内存地址升序排列,整体向堆起始端(如低地址)平移,中间不留空隙。这种顺序移动有两大好处:

讯飞智作
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

下载
  • 保持对象原有空间局部性:相邻对象仍大概率保留在同一缓存行或内存页,减少 CPU 缓存失效
  • 支持单次遍历计算目标地址:无需额外存储映射表,每个对象的新地址 = 当前累计偏移量 + 原大小,实时推导

批量更新引用,避免逐个修正

对象移动后,所有指向它的引用必须同步更新,否则程序将访问错误地址。JVM 不是挨个扫描栈或字段,而是:

  • 在整理过程中维护一个“转发指针”或“位移偏移量”,记录每块连续存活区的整体位移
  • 对栈帧、静态区、对象字段等引用源进行集中扫描,仅修正那些指向已移动区域的引用
  • 部分收集器(如 G1)还利用卡表(Card Table)缩小扫描范围,只检查可能含跨代引用的内存页

针对大对象和高存活率场景做适配

当堆中大量对象长期存活(如缓存、配置、大数组),全堆整理开销会上升。现代 JVM 会主动规避全量移动:

  • G1 改为“部分整理”:只选择若干 Region(区域)进行复制与整理,其余区域暂不处理,平衡停顿与碎片控制
  • ZGC/Shenandoah 使用读屏障+并发整理:移动与用户线程并行执行,引用更新延迟到首次访问时完成,STW 时间压至毫秒级
  • Serial Old / Parallel Old 等则接受较长时间 STW,但通过多线程并行移动对象,缩短实际暂停窗口

相关文章

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

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

下载

相关标签:

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

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

5936

4

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

80

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

40

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

40

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

20

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

20

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

20

15

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

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

2026.10.15

40

20

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

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

2026.10.15

40

18

热门下载

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

精品课程

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

共6课时 | 54.7万人学习

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

共89课时 | 133.8万人学习