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
《手写 Python 虚拟机》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论