lua GC分析

来源:互联网 发布:asmr软件 编辑:程序博客网 时间:2024/06/05 02:27

原文来自:http://blog.codingnow.com/2011/03/lua_gc_1.html

我这里只是做一个笔记。我的内容可能跟他的内容不一样。

Lua是采用一个简单的标记清除算法的 GC 系统。

扩展:

目前最基本的垃圾收集算法有四种,标记-清除算法(mark-sweep),标记-压缩算法(mark-compact),复制算法(copying)以及引用计数算法(reference counting).而现代流行的垃圾收集算法一般是由这四种中的其中几种算法相互组合而成,比如说,对堆(heap)的一部分采用标记-清除算法,对堆(heap)的另外一部分则采用复制算法等等。

简单来说:

标记清除算法就是先做标记,没有被标记的就会被回收。

缺点就是容易出现碎片。

在 Lua 中,一共只有 9 种数据类型,分别为 nil 、boolean 、lightuserdata 、number 、string 、 table 、 function 、 userdata 和 thread 。其中,只有 string table function thread 四种在 vm 中以引用方式共享,是需要被 GC 管理回收的对象。其它类型都以值形式存在。userdata也是gc管理范围内只不过处理方式不同。

lua中gc的机制简单来说就是在GCSpause、GCSpropagate、GCSsweepstring、GCSsweep、GCSfinalize这几种状态之间的切换。

在lua中gc链表自动链接函数luaC_link、luaC_linkupval。把每当一个新的 GCobject 被创建出来,都会被挂接到这个链表上。lua 还有另一种数据类型创建时的挂接过程也被特殊处理。那就是 userdata 。luaS_newudata,这个里面会直接挂接。还得在说一下上面网址的文章写得非常好,对于c++代码看的少的同学们学习非常重要。里面不仅有对代码的解释,也会看出作者分析的过程(就是思维过程,这是最重要的,当然眼界的大小严重影响代码的阅读质量。借《后会无期》里面一句话:你连世界都没看过,哪来的世界观)。

其实学c++根本就是学内存和效率,还有就是见识。





0 0