1、弱表

弱表如何声明呢?通过元表字段__mode来声明,其值必须是字符串,"k"表示关键字是弱的,"v"表示值是弱的,"kv"表示键和值都是弱的。对象才可以收集,数字,布尔,字符串类型的不可以收集。

2、记忆化函数

通过表来记录计算结果,避免下次的重复计算。同时使用弱表来在没有引用时,通过垃圾收集自动处理

local results = {}
setmetatable(results, {__mode = "kv"})
function mem_loadstring(s)local res = results[s]if res == nil thenres = assert(load(s))results[s] = resendreturn res
end

3、弱表实现默认值

local defaults = {}
setmetatable(defaults, {__mode = "k"})
local mt = {__index = function(t) return defaults[t]  end}function setDefault(t, d)defaults[t] = dsetmetatable(t, mt)
end

不同的默认值使用不同的元表,同时使用记忆化特性

local metas = {}
setmetatable(metas, {__mode = "v"})function setDefault(t, d)local mt = metas[d]if mt == nil thenmt = {__index = function() return d  end}metas[d] = mtendsetmetatable(t, mt)
end

4、虚表

dolocal mem = {}setmetatable(mem, {__mode = "k"})function factory(o)local res = mem[o]if not res thenres = (function() return o  end)mem[o] = resendreturn resend
end

因为mem表中的键值对应的是闭包,而闭包又引用键值,导致环。严格的解释器是不会收集key的。

lua中对于表的键值为弱的,而值不是弱的,视为虚表。

5、终结器

lua通过元方法__gc来实现终结器

o = {x = "hi"}
setmetatable(o, {__gc = function(o) print(o.x)  end})
o = nil
collectgarbage()
输出为:
hi

如果在设置元表时,没有设置__gc,后面在通过__gc字段设置不起作用。

o = {x = "hi"}
mt = {}
setmetatable(o, mt)
mt.__gc = function(o) print(o.x)  end
o = nil
collectgarbage()输出:
没有输出

在上面情况时,可以先设置元表的标识为true,在设置元表后,再通过字段设置,也是可以的

o = {x = "hi"}
mt = {__gc = true}
setmetatable(o, mt)
mt.__gc = function(o) print(o.x)  end
o = nil
collectgarbage()
输出:
hi

在收集相关联对象时,关联关系不会影响收集顺序

以单链表为例

mt = {__gc = function(o) print(o[1])  end}
list = nil
for i = 1, 3 dolist = setmetatable({i, link = list}, mt)
endlist = nil
collectgarbage()输出为:
3
2
1

当终结器执行时,会将终结的对象作为参数传递给它,此时对象为短暂复活,执行完后,作为永久复活

lua学习笔记之垃圾收集相关推荐

  1. Lua学习笔记6:C++和Lua的相互调用

    曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. 微信小程序连接物联网(二):NodeMCU Lua学习笔记

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  4. lua 学习笔记---游戏开发第一步

    lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...

  5. Lua学习笔记(2)

    前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...

  6. 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

    Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...

  7. Lua 学习笔记(一)环境搭建

    Lua是一个小巧的脚本语言.Lua由标准C编写而成,代码简洁,几乎在所有的操作系统和平台上都可以编译,运行. 主要讲一下mac和win下的环境搭建. 工具: 1.Sublime Text 2 2.Lu ...

  8. cocos2d-x lua 学习笔记(1) -- 环境结构

    Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...

  9. cocos2d-x lua 学习笔记(1) -- 环境搭建

    Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...

最新文章

  1. 刘鹏飞 袁玮哲:自动生成论文评审意见!AI可以取代审稿人吗?
  2. matlab中窗函数的使用(一)
  3. SQL Server扩展事件(Extended Events)-- 将现有 SQL 跟踪脚本转换为扩展事件会话
  4. SwiftUI之深入解析如何创建和组合视图
  5. eureka对比Zookeeper:
  6. Flink数据清洗(Kafka事实表+Redis维度表)
  7. 抖音一个老人和一个机器人歌曲_一个老人孤独去世,一个老人安然离世
  8. 990. 等式方程的可满足性
  9. C++ 引用计数技术及智能指针的简单实现
  10. C++中打印可变参数函数输出到控制台
  11. python pipe_Python os.pipe()用法及代码示例
  12. Java调用百度/高德地图API实现根据经纬度查地名
  13. RAKsmart日本服务器的综合性能评测
  14. 为什么世界上没有安全的工作?
  15. 转:亚熟男 我们该拿你怎么办?
  16. ECU BootLoader and programming implementation specification
  17. 时间与日期处理模块 题目解题报告
  18. 【已解决】Word转换PDF时自动更新域导致图片表格的引用编号全部乱掉
  19. 使用gitbash创建一个翻译词典
  20. 扭矩扭力测量——扭矩传感器

热门文章

  1. WIN7 X64 Setup Oracle Developer Suite 10g
  2. 解決scott 用戶登錄錯誤: invalid username/password;logon denied
  3. ueditor图片上传,网络连接错误的解决方案
  4. 《转》从程序员到项目经理(五):不是人人都懂的学习要点
  5. android控件属性
  6. 基于MIPS架构的BackTrace实现
  7. python使用缩进来体现代码之间的逻辑关系-Python 使用缩进来体现代码之间的逻辑关系 ....
  8. 下列不是python对文件的读操作方法是-大工20春《数据挖掘》在线作业1【参考答案】...
  9. java和python可以在一个项目中同时使用么-可以同时用python和java开发一个app吗?...
  10. python怎么用excel-用Python控制Excel实现自动化办公,手把手教你