Lua5.3 GC源码阅读(4)

接上篇, Lua中的GC采用的是三色垃圾增量回收算法. 因此真正进入singlestep函数之前, 先来简单介绍一下三色垃圾回收算法. 在三色垃圾回收算法有,每个可回收对象都会有”黑”,”白”,”灰”三种颜色. 所有对象刚创建都是白色(这里暂不考虑barrier的效果), 一个完整的GC循环大概如下: 1. GC从根对象开始遍历并为对象标记颜色.(这里需要明确的时,根对象并不是指前面的global_State.allgc, 而是指Lua中的一些全局对象,比如lua_State, 注册表) 2. GC每当发……

Lua5.3 GC源码阅读(3)

接上篇, 在真正阅读luaC_step源码之前,先来看一下Lua的垃圾回收器对外提供了哪些可调参数, 以及这些参数是如何控制垃圾回收器的. Lua提供了一个函数collectgarbage([opt[,arg]])用于控制GC的一些形为. collectgarbage通过第一个参数opt来执行不同的功能: “collect”: 执行一次完整的垃圾回收循环,这是默认选项. “stop”: 停止垃圾回收器的运行, 在调用”restart”前,回收器只有被显式调用时才运行. “restart”: 重新开始垃圾回收器的自……

Lua5.3 GC源码阅读(2)

上篇已经提到表作为lua中的一种对象,其生命周期是被GC管理的. 下面就从一个表的创建来分析GC模块是如何接管其生命周期的. 先来看一段lua代码 [lua] –a.lua local a = {} a.foo = "bar" [/lua] 使用`luac -p -l a.lua` 得到如下结果 [lua] main <a.lua:0,0> (3 instructions at 0x20d7a50) 0+ params, 2 slots, 1 upvalue, 1 local, 2 constants, 0 functions 1 [1] NEWTABLE 0 0 0 2 [2] SETTABLE 0 -1 -2……

Lua5.3 GC源码阅读(1)

最近Lua 5.4 work1已经发布了, 其中GC最大的变化就是增加了分代GC的实现, 而GC在动态语言中一向是重中之重. 趁着这个机会, 我打算具体比较一下Lua5.3和Lua5.4中GC实现到底是如何变迁的, 根据以往的经验来看, 这其中必然充满各种精巧的设计. Lua5.3的GC源码以前就断断续续看过一次了, 这次打算从头再分析一遍, 并做一下笔记为分析Lua5.4 GC做准备. 在Lua中字符串、表、用户数据、函数、线程、 内部结构等对象,都使用GC模块进行管理. 在分析GC流程前先做一些准备工作, 比如lua中的Val……