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

24|标记和回收:完成对象的搬移以整理内存

你好,我是海纳。
第 22 课我给你介绍了垃圾回收的基本算法原理,第 23 课我们通过修改代码实现了在堆中分配虚拟机对象的功能,从而把所有的对象都放置在堆里。
然而,这些工作实际上只完成了垃圾回收器一半的工作。除了可以分配空间,垃圾回收器还有一个重要功能是回收空间。复制算法是通过把存活对象搬到幸存者空间(Survivor Space)来实现空间回收功能的。所以这一节课,我们就重点实现搬移存活对象的功能。

搬移对象

最适合完成搬移对象功能的结构就是访问者模式。我们定义一个 ScavengeOopClosure 类,它在访问每一个堆内的对象时,就可以完成对象的搬移和指针修改。
// [memory/heap.cpp]
void Heap::copy_live_objects() {
ScavengeOopClosure(eden, survivor, metaspace).scavenge();
}
// [memory/oopClosure.hpp]
class OopClosure {
public:
virtual void do_oop(HiObject** obj) = 0;
virtual void do_array_list(ArrayList<Klass*>** alist) = 0;
virtual void do_array_list(ArrayList<HiObject*>** alist) = 0;
virtual void do_array_list(ArrayList<HiString*>** alist) = 0;
virtual void do_map(Map<HiObject*, HiObject*>** amap) = 0;
virtual void do_raw_mem(char** mem, int length) = 0;
virtual void do_klass(Klass** k) = 0;
};
class ScavengeOopClosure : public OopClosure {
private:
Space* _from;
Space* _to;
Space* _meta;
Stack<HiObject*>* _oop_stack;
HiObject* copy_and_push(HiObject* obj);
public:
ScavengeOopClosure(Space* from, Space* to, Space* meta);
virtual ~ScavengeOopClosure();
virtual void do_oop(HiObject** oop);
virtual void do_array_list(ArrayList<Klass*>** alist);
virtual void do_array_list(ArrayList<HiObject*>** alist);
virtual void do_array_list(ArrayList<HiString*>** alist);
template <typename T>
void do_array_list_nv(ArrayList<T>** alist);
virtual void do_map(Map<HiObject*, HiObject*>** amap);
virtual void do_raw_mem(char** mem, int length);
// CAUTION : we do not move Klass, because they locate at MetaSpace.
virtual void do_klass(Klass** k);
void scavenge();
void process_roots();
};
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 实现搬移存活对象的功能是垃圾回收器的重要功能之一,通过复制算法将存活对象搬移到幸存者空间来实现空间回收。 2. 使用访问者模式中的ScavengeOopClosure类来完成搬移对象功能,该类在访问每一个堆内的对象时,可以完成对象的搬移和指针修改。 3. 处理根集合(roots)是GC算法的关键步骤,包括处理Universe中的全局对象指针、StringTable中的字符串以及程序栈上的Frame对象等。 4. 在GC执行过程中,需要保证根对象被复制完毕并存储在搬移对象栈中,等待进一步处理。 5. 虚拟机栈帧中的引用需要使用Handle类来记录,以便在垃圾回收过程中正确维护这些指针。 6. Handle类的双向链表结构和相关方法可以有效记录虚拟机栈帧中的指针变量,并通知垃圾回收器及时正确地维护这些指针。 7. 通过HandleMark遍历链表里的所有元素,让垃圾回收器可以正确地维护Handle中所记录的指针。 8. 实现复制算法的基本步骤包括处理根集合、对栈中的对象进行非递归的深度优先遍历、使用forwarding指针解决多个对象引用同一个对象的情况以及使用Handle记录虚拟机栈帧上的引用。 9. 复制算法的实现主要有四步:处理根集合、对栈中的对象进行非递归的深度优先遍历、使用forwarding指针解决多个对象引用同一个对象的情况、使用Handle记录虚拟机栈帧上的引用。 These key points summarize the important aspects of the article, focusing on the implementation of the garbage collection algorithm and the use of the Handle class to maintain references in the virtual machine stack frames.

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

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部