MicroPython GC模块原理
一、 回收算法
GC模块的回收算法只用到了标记清除算法(make-sweep),通过标记的方法将内存分为free和mark状态,每次调用回收函数时会将未mark的区域回收。当内存使用达到阈值或者主动调用GC.collect()会进行垃圾回收。
二、 内存分布
被管理的内存空间分为三部分,分别是alloc table(ATB)、finaliser table(FTB)、和pool(详细算法见gc_init函数)。
分配的最小单位为block,块的大小通过BYTES_PER_BLOCK设置。
alloc table:用来记录每个block的状态,状态分为free和mark两种,用两个bit表示状态。
Finalizer table:用来记录block是否使用finaliser(__del__方法),用一个bit表示。
Pool: 用户使用的空间。
三、 标记回收过程
Micropython的GC回收主要使用两个函数gc_collect_root、gc_sweep
gc_collect_root主要遍历栈中正在使用的gc内存,并将其mark防止被释放,之后再调用gc_sweep进行回收,将所有unmark的内存,gc_sweep会遍历所有block将未标记的内存进行回收释放,已经标记的块再次置为未标记状态,用于下次回收,这样就形成了垃圾回收的循环。
![在这里插入图片描述](https://img-blog.****img.cn/20191111110632597.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0NDE5NjI=,size_16,color_FFFFFF,t_70
四、 Micropython GC模块缺陷
1、micropython多线程模式下,gc回收时是遍历的整个线程栈,此处后期需要进行优化。
2、相对于cpython和java等高级语言的垃圾回收机制,缺少分代算法、引用计数算法、复制算法等方式提高稳定性和回收效率。