在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言已经有很多人写了gc源码分析的文章了,自己为啥还要继续写呢?最主要的原因有两个:
原理mark & sweep算法,维基上的词条叫Tracing garbage collection[1]. 根据名字也可以知道,最主要包括两个阶段:mark阶段和sweep阶段。 mark阶段这个阶段叫做扫描阶段。简单来讲,就是对于现在lua用到的所有对象进行扫描一次。如果某个对象当前跟别的对象有引用关系,那么说明他还在用;如果某个对象跟其他任何对象都没有引用关系了,说明这个对象已经没有用了。这个阶段做完,就可以知道哪些对象还有用,哪些对象不再使用了,下面就交给下一个阶段,sweep阶段。
sweep阶段这个阶段做的事情其实很少,关键步骤在前一个阶段做完了。这个阶段根据前一个扫描阶段得到的结果,遍历一遍所有对象。如果这个对象已经标记为不再使用了,就会被清理掉,释放掉所在的内存;如果这个对象还在使用,那么就处理一下状态,等待下一次gc在处理。 这里说的很简单,至于扫描阶段做了什么,怎么个标记法;以及处理阶段又具体做了什么,被引用的对象,清理状态又干了什么,这些细节等待后面深入lua源码的时候再一一分析。 如果mark阶段一次性把所有节点都扫描,再一次性清理完,那么这两个步骤就都很简单了。但是,这样就有效率问题,一次性要把所有对象处理一遍,在大工程里面就绝对是一个瓶颈。所以,lua5.0以后就把gc改成了增量式的gc,主要是把标记扩展成了三种颜色,下面详细介绍一下。 三种颜色三种颜色会让lua的gc,主要是扫描和清理阶段不再简单粗暴,而是一次性处理一部分,可以随时中断,下次再进来处理。三种颜色:包括白, 灰和黑。[2]
数据流下面给出一个数据流的图[2],详细的内容后面的章节再继续阐述。 参考[1]Tracing garbage collection |
请发表评论