手写 Python 虚拟机
海纳
华为资深编译专家,原 Huawei JDK 团队负责人
1270 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 27 讲/共 28 讲
导学|直播加餐:三小时掌握C++ (3讲)
手写 Python 虚拟机
15
15
1.0x
00:00/00:00
登录|注册

23|复制算法:最简单高效的垃圾回收算法

你好,我是海纳。
上一节课,我们讲到 GC 算法大致可以分为两大类:引用计数法和基于可达性分析的算法。在基于可达性分析的 GC 算法中,最基础、最重要的一类算法是基于 Copy 的 GC 算法(后面简称 Copy 算法)。
Copy 算法是最简单实用的一种模型,也是我们学习 GC 算法的基础。而且它被广泛地使用在各类语言虚拟机中,例如 JVM 中的 Scavenge 算法就是以它为基础的改良版本。
这一节课,我们就从 Copy 算法的基本原理开始讲起,再逐步拓展到 GC 算法的具体实现。

复制回收

基于 Copy 的 GC 算法最早是在 1963 年,由 Marvin Minsky 提出来的。算法的第一步是把空间分成两部分,一个叫分配空间(Allocation Space),一个是幸存者空间(Survivor Space)。分配对象时,新的对象都创建在分配空间里。
在垃圾回收阶段,把分配空间里的活动对象复制到幸存者空间,把原来的分配空间全部清空。然后把这两个空间交换,就是说分配空间变成下一轮的幸存者,现在的幸存者空间变成分配空间。
在有些文献和代码实现中,分配空间也会被称为 from 空间,幸存者空间也被称为 to 空间。在课程中,为了强调复制的方向性,讨论垃圾回收的时候,主要还是使用 from 空间和 to 空间来指代分配空间和幸存者空间。但当讨论内存分配的时候,也会混合着使用 eden 和 survivor 这一组名词。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

1. Copy算法是垃圾回收算法中的基础模型,将堆空间分为分配空间和幸存者空间,通过复制活动对象到幸存者空间来进行垃圾回收。 2. Copy算法的内存分配过程采用碰撞指针(Bump-pointer)方式,保证对象之间没有空隙,提高分配效率。 3. 在复制对象回收空间时,使用深度优先搜索算法和forwarding指针来解决重复访问对象和引用修改的问题。 4. 通过重载new操作符,将所有对象的内存分配统一在堆中进行,实现了对象的统一管理。 5. Valgrind工具可以用于检查内存泄漏,确保虚拟机的正确性。 6. 定位new表达式在已分配的原始内存中初始化一个对象,它不分配内存,而是在已分配好的内存地址上初始化对象,可用于特定的预分配的内存地址构造对象。 7. Hotspot中的Scavenge回收器也是基于Copy算法,但其堆空间与简单的对半分方案有所不同,可以探讨两种不同实现的优缺点。 These key points summarize the main concepts and developments in the article, providing a clear overview of the important information.

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手写 Python 虚拟机》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)