【前言】

在历史长河中,各种各样的新语言,总是伴随着我们编程人员;有的时候,工作的需要,我们不得不去学习这些很炫的,很新的语言。学习任何一门语言(我这里只说学习),都无非就是学习那么几个大模块,基本语法,标准库,函数或面向对象,内存管理。而对于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. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash

    传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...

  2. DependencyInjection源码解读之ServiceProvider

    var services = new ServiceCollection(); var _serviceProvider = services.BuildServiceProvider(); serv ...

  3. pyspider常见错误

    安装完爬虫框架pyspider之后,使用pyspider all 命令,可能会出现以下错误: - Deprecated option 'domaincontroller': use 'http_aut ...

  4. iOS 简易型标签的实现(UICollectionView)

    https://blog.csdn.net/sinat_39362502/article/details/80900984 2018年07月03日 16:49:05 Recorder_MZou 阅读数 ...

  5. 关于 i++ 与 ++i

    首先关于这个真的不想在看资料了,自己都背过了,++i 和 i++,在单独使用时,就是 i=i+1. a = ++i        相当于 i=i+1; a = i; (先i = i + 1,再使用i的 ...

  6. linux java 和jmeter 环境变量配置文件笔记(原)

    我在EC2 亚马逊的ubuntu系统下进行的配置,步骤如下(非常简单) 1.在/usr/local下分别新建java和jmeter文件夹,把下载的包进行解压 注:此处有坑,需注意ll -lht  查看 ...

  7. SparkStreaming+Kafa+HBase

    1. 总结一些概念: 安装zookeeper3.4.6 cp zoo_sample.cfg zoo.cfgvim zoo.cfg tickTime=2000initLimit=10syncLimit= ...

  8. WSL、Git on Windows 、Putty等的创建的rsa秘钥与连接linux的使用。

    1. 在windows 上面可以使用多种方式创建公钥和私钥 这里从一开始说: 1.1 windows subsystem linux 的方式最简单了 cmd 命令行 下 进入 WSL 输入命令 bas ...

  9. Ajax提交表单初接触

    <!doctype html> <html class="no-js"> <head> <meta charset="utf-8 ...

  10. EntityFramework Core笔记:表结构及数据基本操作(2)

    1. 表结构操作 1.1 表名 Data Annotations: using System.ComponentModel.DataAnnotations.Schema; [Table("R ...