lua 5.2 GC 源码分析 二

关于GC部分,更具体的涉及四个接口。

         分别查看一下四个接口:

         1、GCTM
               GCTM是调用节点的元方法中的GC接口释放相应的虚拟机以外的内存。

         2、freeobj
               freeobj是释放proto、closure、upvalue、table、thread、userdata、string对象在分配的内存。

         3、clearkeys
              clearkeys则是清除lua弱表中hash部分的键对象,因为只有hash部分才有键值对关系。

         4、clearvalues                

              clearvalues则是清除lua弱表中数组部分和hash部分的值对象(lua表分数组部分和hash部分)。

         看完这些,大概可以更仔细的阅读接口atomic了。

  1. static l_mem atomic (lua_State *L) {  
  2.   global_State *g = G(L);  
  3.   l_mem work = -cast(l_mem, g->GCmemtrav);  /* start counting work */  
  4.   GCObject *origweak, *origall;  
  5.   lua_assert(!iswhite(obj2gco(g->mainthread)));  
  6.   markobject(g, L);  /* mark running thread */  
  7.   /* registry and global metatables may be changed by API */  
  8.   markvalue(g, &g->l_registry);  
  9.   markmt(g);  /* mark basic metatables */  
  10.   /* remark occasional upvalues of (maybe) dead threads */  
  11.   remarkupvals(g);  
  12.   propagateall(g);  /* propagate changes */  
  13.   work += g->GCmemtrav;  /* stop counting (do not (re)count grays) */  
  14.   /* traverse objects caught by write barrier and by 'remarkupvals' */  
  15.   retraversegrays(g);  
  16.   work -= g->GCmemtrav;  /* restart counting */  
  17.   convergeephemerons(g);  
  18.   /* at this point, all strongly accessible objects are marked. */  
  19.   /* clear values from weak tables, before checking finalizers */  
  20.   clearvalues(g, g->weak, NULL);  
  21.   clearvalues(g, g->allweak, NULL);  
  22.   origweak = g->weak; origall = g->allweak;  
  23.   work += g->GCmemtrav;  /* stop counting (objects being finalized) */  
  24.   separatetobefnz(L, 0);  /* separate objects to be finalized */  
  25.   markbeingfnz(g);  /* mark objects that will be finalized */  
  26.   propagateall(g);  /* remark, to propagate `preserveness' */  
  27.   work -= g->GCmemtrav;  /* restart counting */  
  28.   convergeephemerons(g);  
  29.   /* at this point, all resurrected objects are marked. */  
  30.   /* remove dead objects from weak tables */  
  31.   clearkeys(g, g->ephemeron, NULL);  /* clear keys from all ephemeron tables */  
  32.   clearkeys(g, g->allweak, NULL);  /* clear keys from all allweak tables */  
  33.   /* clear values from resurrected weak tables */  
  34.   clearvalues(g, g->weak, origweak);  
  35.   clearvalues(g, g->allweak, origall);  
  36.   g->currentwhite = cast_byte(otherwhite(g));  /* flip current white */  
  37.   work += g->GCmemtrav;  /* complete counting */  
  38.   return work;  /* estimate of memory marked by 'atomic' */  
  39. }  
         mark开头的接口,在判断该节点为白色之后,会将该节点插入g->gray链表的头部。

         在remarkupvals接口中,在判断uv节点为灰色之后,会将uv->v值放到染色逻辑中,过滤。

         propagateall接口过滤当前g->gray链表。

         retraversegrays重新遍历所有灰色节点的链表(把traverse翻译成遍历就很好理解了)。

         convergeephemerons过滤g->ephemeron链表。

         separatetobefnz从g->finobj链表上将无法到达的节点移动到g->tobefnz链表上。

         g->currentwhite = cast_byte(otherwhite(g));切换白色比特位,这样以后,下次再遇到是白色,并且与当前白色不同的节点,就是可以回收的对象了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值