标记-整理算法的指针碰撞分配策略分析

轻雪同学_4664

轻雪同学_4664

2026-08-20

331人浏览

原创

标记-整理算法通过将存活对象紧凑移至一端并清理边界外空间,使堆内存规整、空闲区连续,从而为指针碰撞提供必要前提;此时jvm只需原子移动分界指针即可完成分配。

标记-整理算法的指针碰撞分配策略分析

标记-整理算法本身不直接等同于指针碰撞,但它为指针碰撞创造了前提条件——堆内存规整。真正执行分配动作的,是JVM在规整后的堆上启用的指针碰撞机制。

为什么标记-整理后能用指针碰撞

标记-整理算法分两步:先标记所有存活对象,再将它们全部向内存一端(如起始地址)紧凑移动,最后清理边界外的废弃空间。这一过程消除了碎片,使已用内存与空闲内存严格分界,中间形成一条清晰的“分界指针”。这正是指针碰撞唯一依赖的物理基础。

  • 整理前:内存中存活对象散落各处,空闲块大小不一、位置随机 → 只能靠空闲列表逐个查找
  • 整理后:所有存活对象紧挨着排在低地址侧,高地址侧是一整块连续空闲区 → 指针只需向右平移对象大小即可完成分配
  • 典型场景:Serial Old、Parallel Old 收集器的老年代回收后,常采用指针碰撞分配新晋升对象

指针碰撞在标记-整理堆中的实际行为

分配不是简单“挪指针”,而是一套受控的原子操作:

  • 分配请求到达时,JVM检查剩余空闲空间是否 ≥ 对象所需字节数;不足则触发下一次GC
  • 确认足够后,通过CAS(Compare-and-Swap)原子更新全局分配指针,避免多线程竞争错位
  • 实践中几乎总配合TLAB(Thread Local Allocation Buffer):每个线程独占一小段Eden或老年代空间,先在本地指针上 bump,满后再同步全局指针,大幅减少CAS争用
  • 分配完成后,对象头写入、字段初始化等后续动作由解释器或JIT完成,与分配机制解耦

它和复制算法下的指针碰撞有何不同

虽然都用指针碰撞,但底层内存结构逻辑不同:

  • 复制算法(如ParNew年轻代):每次GC后,From区清空,To区变成全新规整空间,指针从0开始 bump —— 是“重建式”规整
  • 标记-整理算法(如Serial Old老年代):不切换区域,而是原地压缩迁移,保留原有对象相对顺序,指针在原有地址空间内推进 —— 是“就地压实式”规整
  • 因此,标记-整理后的指针碰撞更依赖内存地址连续性,对大对象分配更敏感;若剩余空闲段不够大,即使总空闲量充足,也无法使用指针碰撞,会退化为空闲列表

什么情况下会失效或降级

即使刚做完标记-整理,指针碰撞也不总是可用:

  • 禁用TLAB(-XX:-UseTLAB)且并发线程多 → 全局指针CAS失败率升高,JVM可能临时启用空闲列表兜底
  • 分配超大对象(如长度超阈值的数组),超出当前空闲段容量 → 直接跳过指针碰撞,查空闲列表找合适块
  • G1收集器在老年代虽有整理能力,但默认按Region管理,不追求全局规整 → 即使局部Region被整理,整体仍走空闲列表或分区式分配,而非传统指针碰撞
  • ZGC、Shenandoah等低延迟收集器,因并发整理无法保证瞬时全局规整,也基本不依赖指针碰撞分配
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

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

下载

相关标签:

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

相关专题

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

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

2026.04.23

299

31

页面置换算法
页面置换算法

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

2023.08.14

4616

4

NumPy性能优化版本更新与常见报错排查
NumPy性能优化版本更新与常见报错排查

本专题整理 NumPy 性能优化、版本更新与常见报错排查相关教程,覆盖向量化计算、广播性能、内存布局、NumPy 2.0 升级、版本兼容冲突、安装导入报错、dtype 溢出、矩阵运算异常和 broadcasting 报错修复,帮助读者系统掌握 NumPy 性能调优与问题定位方法。

2026.09.22

0

25

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

2026.09.21

20

20

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

2026.09.21

20

24

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

2026.09.21

0

20

NumPy广播机制数学运算与统计分析
NumPy广播机制数学运算与统计分析

本专题整理 NumPy 广播机制、数组数学运算与统计分析相关教程,覆盖广播规则、维度对齐、矩阵与数组加减除法、向量化计算、均值方差、分位数、中位数、直方图和 unique 频次统计等场景,帮助读者掌握 ndarray 高效计算与统计处理方法。

2026.09.21

0

17

NumPy数组创建索引切片与数据选择
NumPy数组创建索引切片与数据选择

本专题整理 NumPy 数组创建、索引、切片与数据选择相关教程,覆盖 np.array、zeros/ones、多维数组形状、基础切片、花式索引、布尔索引、条件筛选、视图与副本等常用场景,帮助读者系统掌握 ndarray 数据构造与高效提取方法。

2026.09.21

0

12

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

40

13

热门下载

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

精品课程

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

共6课时 | 54.6万人学习

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

共89课时 | 133.1万人学习