lua 垃圾回收标记函数 reallymarkobject
来源:互联网 发布:keil c51keil软件仿真 编辑:程序博客网 时间:2024/05/16 14:23
reallymarkobject 函数如下(省略旁路代码):
static void reallymarkobject (global_State *g, GCObject *o) { white2gray(o); switch (o->gch.tt) { case LUA_TSTRING: { return; } case LUA_TUSERDATA: { Table *mt = gco2u(o)->metatable; gray2black(o); /* udata are never gray */ if (mt) markobject(g, mt); markobject(g, gco2u(o)->env); return; } case LUA_TUPVAL: { UpVal *uv = gco2uv(o); markvalue(g, uv->v); if (uv->v == &uv->u.value) /* closed? */ gray2black(o); /* open upvalues are never black */ return; } case LUA_TFUNCTION: { gco2cl(o)->c.gclist = g->gray; g->gray = o; break; } case LUA_TTABLE: { gco2h(o)->gclist = g->gray; g->gray = o; break; } case LUA_TTHREAD: { gco2th(o)->gclist = g->gray; g->gray = o; break; } case LUA_TPROTO: { gco2p(o)->gclist = g->gray; g->gray = o; break; } }}
首先解释下三色标记法,GC中用三种颜色标记不同的对象:
(1) 黑色:本身强引用,并已处理对象中的子引用
(2) 灰色:本身强引用,还没处理对象中的子引用
(3) 白色:不可达对象
三色标记法中,黑色和白色不可能直接相连,任何被黑色对象引用的对象都意味着是可达的(即不能是白色),必须有灰色来过渡。
解释完三色标记法之后,我们具体来看标记函数。
标记函数实际上是一个大switch case结构。函数首先把所有白色对象都标记成灰色,然后对每个具体类型,做具体标记,下面按类型来分析。
字符串
所有字符串对象,无论是长串还是短串,都没有引用其他对象。我们看到字符串类型标记成灰色后直接返回了。字符串是永远不会被标记成黑色?userdata
我们看到userdata类型对象直接是标记成黑色,然后立即标记它的元表和环境表。在这里markobject实际还是调用的reallymarkobject函数,因此产生递归。自由变量(upvalue)
自由变量脱离创建它的作用域的时候(closed),此时自由变量指向本身,直接标记成黑色;否者自由变量实际上是引用栈上的值,这个时候相当于弱引用,依附于栈。函数|表|线程|原型
我们可以看到对象保存着当前标记之前的全局灰链,然后把自身赋予给灰链,并标记自己为黑色。把这些本身强引用,但还没处理对象中的子引用对象串联起来。在扩散标记阶段,处理标记灰链中对象的时候,处理完子饮用后,就可以通过对象的gclist指针恢复上一个灰链。
另外,说灰链中的对象不意味着对象是灰色。
0 0
- lua 垃圾回收标记函数 reallymarkobject
- lua 垃圾回收标记函数 reallymarkobject
- lua垃圾回收机制
- lua垃圾回收机制
- lua垃圾回收机制
- Lua垃圾回收
- Lua 垃圾回收
- lua垃圾回收机制
- lua 语法-垃圾回收
- lua垃圾回收机制
- jvm垃圾回收-标记复制
- lua的垃圾回收机制
- Lua中的垃圾回收机制
- GC垃圾回收的三色标记算法
- 垃圾回收器之标记擦除法
- 以标记清除的方式垃圾回收
- java垃圾回收算法之-标记清除
- JVM垃圾回收的二次标记
- lintcode:First Bad Version
- NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
- 如何开始使用bootstrap
- 牛的选举
- C语言基础(二)
- lua 垃圾回收标记函数 reallymarkobject
- 防重复请求处理的实践与总结
- python集合
- Bresenham算法
- C#之多态
- 使用nuget发布自己写的类库
- C语言基础(三)
- 会话发起协议——SIP
- 为什么要做一些事