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了。

static l_mem atomic (lua_State *L) {
  global_State *g = G(L);
  l_mem work = -cast(l_mem, g->GCmemtrav);  /* start counting work */
  GCObject *origweak, *origall;
  lua_assert(!iswhite(obj2gco(g->mainthread)));
  markobject(g, L);  /* mark running thread */
  /* registry and global metatables may be changed by API */
  markvalue(g, &g->l_registry);
  markmt(g);  /* mark basic metatables */
  /* remark occasional upvalues of (maybe) dead threads */
  remarkupvals(g);
  propagateall(g);  /* propagate changes */
  work += g->GCmemtrav;  /* stop counting (do not (re)count grays) */
  /* traverse objects caught by write barrier and by 'remarkupvals' */
  retraversegrays(g);
  work -= g->GCmemtrav;  /* restart counting */
  convergeephemerons(g);
  /* at this point, all strongly accessible objects are marked. */
  /* clear values from weak tables, before checking finalizers */
  clearvalues(g, g->weak, NULL);
  clearvalues(g, g->allweak, NULL);
  origweak = g->weak; origall = g->allweak;
  work += g->GCmemtrav;  /* stop counting (objects being finalized) */
  separatetobefnz(L, 0);  /* separate objects to be finalized */
  markbeingfnz(g);  /* mark objects that will be finalized */
  propagateall(g);  /* remark, to propagate `preserveness' */
  work -= g->GCmemtrav;  /* restart counting */
  convergeephemerons(g);
  /* at this point, all resurrected objects are marked. */
  /* remove dead objects from weak tables */
  clearkeys(g, g->ephemeron, NULL);  /* clear keys from all ephemeron tables */
  clearkeys(g, g->allweak, NULL);  /* clear keys from all allweak tables */
  /* clear values from resurrected weak tables */
  clearvalues(g, g->weak, origweak);
  clearvalues(g, g->allweak, origall);
  g->currentwhite = cast_byte(otherwhite(g));  /* flip current white */
  work += g->GCmemtrav;  /* complete counting */
  return work;  /* estimate of memory marked by 'atomic' */
}
         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、付费专栏及课程。

余额充值