Lua 5.3 设计实现(六) GC 垃圾回收
虽然本系列主要讲的是 Lua 5.3 中的实现,不过在本篇中,想先聊聊 Lua 垃圾回收的历史。只有了解其历史,才知道为什么这么设计。
Lua GC 历史
Lua 5.0 之前
在 Lua 5.0 之前,Lua 因为没有 userdata
,垃圾回收的工作就很简单了,因为没有 userdata
也就没有了 __gc
元方法,也就不需要针对有特殊析构操作的对象进行特殊处理。
Lua 从早期到现在 2020年
推出的 最新版 Lua 5.4 都是采用的标记扫描算法,垃圾回收算法一般分为两类。
- 标记扫描算法
- 引用计数算法
引用计数的话,每个对象都要占用多一块内存,同时需要频繁的增减引用计数值,特别指的是在栈上的时候,Lua 解释器做的又非常简单,如果采用引用计数,还要对指令进行优化。
而早期 标记扫描 也是比较简单,首先它每次扫描且回收垃圾都是需要一次执行完的,其次它只有两种标记,用到或没用到,而且每次创建新对象都会跑一次GC。
显然,这种垃圾回收注定了没人敢用。。。我每创建一个对象,你都跑一次GC,这谁顶得住?