GC
lua 的 gc 负责自动回收不再使用的堆内存(?是吗)
CommonHeader
CommonHeader 是所有可回收对象的公共头部,定义在 lobject.h 中:
/*
** Common Header for all collectable objects (in macro form, to be
** included in other objects)
*/
#define CommonHeader \
struct GCObject *next; \
lu_byte tt; \
lu_byte marked
next:连接到所有 GC 对象链表tt:说明这是 Lua closure 还是 C closuremarked:GC 标记状态以及分代年龄
所有可回收对象开头都有这三个字段,因此都可以被视作 GCObject 对象。
/* Common type for all collectable objects */
typedef struct GCObject {
CommonHeader;
} GCObject;
lua VM 内部会维护一个超大的 GCObject 链表,所有当前存活的可回收对象都会被挂在这个链表上。
lua 的垃圾回收有两种算法:incremental mark-and-sweep 和 generational。前者是增量标记清除,后者是分代回收。