【前言】

在历史长河中,各种各样的新语言,总是伴随着我们编程人员;有的时候,工作的需要,我们不得不去学习这些很炫的,很新的语言。学习任何一门语言(我这里只说学习),都无非就是学习那么几个大模块,基本语法,标准库,函数或面向对象,内存管理。而对于Lua的学习,前面几个模块我都已经总结完毕了,而今天这篇文章主要是总结Lua中的内存管理。

Lua在两个层面提供了对这些定制的支持。在较低层面,可以设置Lua使用的分配函数;在较高层面,可以设置一些控制垃圾收集器的参数,或者直接控制垃圾收集器。现在就开始这一篇的旅行吧。

【分配函数】

Lua是通过一个“分配函数”来完成所有的内存分配和释放操作。当用户创建一个Lua状态时,必须提供这个函数。之前的代码中总是会用到一个luaL_newstate辅助函数,这个函数会以一个默认的分配函数来创建Lua状态。默认的分配函数使用了C标准库中的malloc-realloc-free函数,对于普通的应用程序这已经足够了,然而,要获取对Lua内存分配的完全控制也是非常容易的,只需要用原始的lua_newstate来创建状态就可以了:

lua_State *lua_newstate(lua_Alloc f, void *ud);

这个函数接收两个参数:分配函数和用户数据。以这种方式创建的状态会调用f来完成所有的内存分配和释放。由于分配内存的策略很多,而对于lua_Alloc分配函数的分析和讲解,也不是这篇文章的重点;这篇文章,只是对Lua内存管理进行简单的说明,让你知道有这么个东西,有这么回事,那么我的这篇文章就达到目的了。

【垃圾收集器】

Lua在5.0版之前,都是采用的一种简单的“标记并清理”的垃圾收集器。这种垃圾清理的每个周期由4个阶段组成:标记、整理、清扫和收尾。Lua有时会为了完成一个完整的垃圾收集周期而暂停与主程序的交互。接下来,就对一个垃圾清理周期中的每个阶段进行详细的说明。

在标记阶段,Lua先将“根集合”中的对象标记为“活跃”。根集合中的对象就是Lua可以直接访问的对象,它们是注册表中的对象和主线程对象。然后,Lua将任何程序可以通过根集合对象访问到的对象也都标记为“活跃”。这样会使所有可到达的对象都标记为“活跃”了。

在开始清扫阶段前,Lua先要进入整理阶段。这个阶段为“终结函数”和弱引用table。首先,Lua遍历所有的userdata,找出所有未被标记且具有–gc元方法的userdata。然后,将这些userdata标记为“活跃”,并放入一个单独的列表中。这个列表在收尾阶段会用到。另一方面,Lua还会遍历所有的弱引用table,并根据弱引用设置删除其中未被标记的key和value。

在清扫阶段中,Lua遍历所有的对象。如果当前遍历到的对象未被标记,就收集它。否则,Lua就清除它的标记,从而为下一个收集周期做准备。

最后是收尾阶段,其中会根据整理阶段中生成的userdata列表来调用它们的终结函数。在最后才进行这些调用是为了简化错误处理。

Lua的内存管理的更多相关文章

  1. lua内存管理

    本文内容基于版本:Lua 5.3.0 Lua内存管理器规则 Lua允许用户自定义内存管理器,并在创建Lua虚拟机(lua_State实例)时传入.当然自定义内存管理器必须遵循Lua已定义的一些行为规则 ...

  2. 【Cocos2d-x 3.x】内存管理机制与源码分析

    侯捷先生说过这么一句话 :  源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...

  3. cocos2d-x之内存管理(4)

    c++的内存管理一直以来都是个问题,也有多种实现方案,比如智能指针,使用引用计数等,cocos2d-x也需要涉及到内存的管理. cocos2d-x是如何管理内存的呢? cocos2d-x的内存管理主要 ...

  4. 再谈LRU双链表内存管理

    N年前我写了个双链表也发了博客,还添了代码.但是那个代码不但复杂,而且还有有问题的,一直懒得整理,放在空间误导别人.最近在写服务端,今天抽点空补一篇. 关于LRU网上随便搜,有过后端经验的人应该很多都 ...

  5. Cocos2d-x内存管理研究<二>

    http://hi.baidu.com/tzkt623/item/46a26805adf7e938a3332a04   上一篇我们讲了内核是如何将指针加入管理类进行管理.这次我将分析一下内核是如何自动 ...

  6. Cocos2d-X内存管理研究<一>

    http://hi.baidu.com/tzkt623/item/651ca7d7a0aff6e055347f67        半夜没事干,研究内核,作为我cocos2d-x的第一篇教程.cocos ...

  7. GC与显式内存管理

    C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新.然而,从这两年的效果而言,C++的复兴并没有发生.一方面随着世界经 ...

  8. 垃圾回收基本算法 内存管理 GC大统一理论

    <垃圾收集> (豆瓣) https://book.douban.com/subject/1157908/ 第1章 简介1.1 内存分配的历史1.1.1 静态分配1.1.2 栈分配1.1.3 ...

  9. [置顶] 【玩转cocos2d-x之二十】从CCObject看cocos2d-x的内存管理机制

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/13765639 再看CCObject,剔除上节的拷贝相关,以及Lua脚本相关的 ...

随机推荐

  1. Linux下时钟框架实践---一款芯片的时钟树配置

    关键词:时钟.PLL.Mux.Divider.Gate.clk_summary等. 时钟和电源是各种设备的基础设施,整个时钟框架可以抽象为几种基本的元器件:负责提供晶振 Linux内核提供了良好的CC ...

  2. spring @CrossOrigin解决跨域问题

    阅读目录: 一.跨域(CORS)支持: 二.使用方法: 1.controller配置CORS 2.全局CORS配置 3.XML命名空间 4.How does it work? 5.基于过滤器的CORS ...

  3. 再看ExpressionTree,Emit,反射创建对象性能对比

    [前言] 前几日心血来潮想研究着做一个Spring框架,自然地就涉及到了Ioc容器对象创建的问题,研究怎么高性能地创建一个对象.第一联想到了Emit,兴致冲冲写了个Emit创建对象的工厂.在做性能测试 ...

  4. idea注册码到期,破解idea

    http://idea.lanyus.com/    

  5. python 支付宝SDK

    python 支付宝SDK代码如下 from datetime import datetime from Crypto.PublicKey import RSA from Crypto.Signatu ...

  6. linux 运维工程师发展路线

    linux运维发展常见的就是下面两条路线:第一条:运维应用-->系统架构-->运维开发-->系统开发第二条:运维应用-->应用dba-->架构dba-->开发DBA ...

  7. 数据交换格式与SpringIOC底层实现

    1.数据交换格式 1.1 有哪些数据交换格式 客户端与服务器常用数据交换格式xml.json.html 1.2 数据交换格式应用场景 1.2.1 移动端(安卓.iOS)通讯方式采用http协议+JSO ...

  8. python之内置函数(一)

    一.内置函数一1.内置函数总览 abs() dict() help() min() setattr()all() dir() hex() next() slice() any() divmod() i ...

  9. python学习日记(isinstance和issubclass)

    isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) issu ...

  10. python学习日记(内置、匿名函数练习题)

    用map来处理字符串列表 用map来处理字符串列表,把列表中所有水果都变成juice,比方apple_juice fruits=['apple','orange','mango','watermelo ...