一、概述
lua实现了对象间的引用管理,在对象不被其他对象应用时,自动释放对象的内存。
二、lua对象类型和数据结构
1、哪些类型需要GC
lua的基本类型包括nil、boolean、number、lightuserdata、string、table、function、userdata、thread九种数据类型,另外还有proto、upvalue两种内部类型。
其中string、table、function、userdata、thread、proto、upvalue是引用类型,可以被其他多个对象同时引用,需要通过自动GC机制来回收。
2、GC根
gc的根包括主线程(lua_State)、注册表(registry)和9种基本类型的元表(mt),其他的线程会被主线程的栈帧引用。
3、GC对象管理
GC管理的对象类型包括string、table、function、userdata、thread、proto、upvalue,这些类型的结构体包含相同的GC信息头,被命名为GCObject。所有分配的对象会被global_State结构体里的rootgc所管理。string是个例外,string不会再引用其他对象,但可以被多个对象引用,string被单独放在了strt里管理。
下面是除string外对象的管理示意图,绿色文字节点为最新创建的对象。
下面是string对象的管理示意图,绿色背