Chapter 17_1 弱引用table
Lua采用了自动内存管理。所以不用担心新创建的对象需要的内存如何分配出来,也不用考虑对象不再被使用后怎样释放它们所占用的内存。
Lua实现了一个增量标记-扫描收集器。它使用这两个数字来控制垃圾收集循环:垃圾收集器间歇率 和 垃圾收集器步进倍率。
这两个数字都使用百分数为单位(例如:100在内部表示1)
前者表示控制收集器需要在开启新的循环前要等待多久,后者表示控制收集器运作速度相对于内存分配速度的倍率(不要设置为小于100,否则收集慢于分配)。
在Lua中,你可以用弱引用和终结器作为垃圾回收的机制。先来看弱引用table。
用户能用它来告诉Lua一个引用不应该阻碍一个对象的回收。弱引用就是一种会被垃圾收集器忽视的对象引用。
如果一个对象的所有引用都是弱引用,那么Lua就可以回收这个对象了,并且还可以以某种形式来删除这些弱引用本身。
Lua用 “弱引用table” 来实现 “弱引用”,一个弱引用table就是一个具有弱引用条目的table。
如果一个对象只被一个弱引用table所持有,那么最终Lua会回收这个对象。
通常,垃圾收集器不会回收一个可访问table中的作为key或value的对象。也就是说,这些key和value都是强引用,它们会阻止对其所引用对象的回收。
在一个弱引用table中,key和value是可以回收的。有3种弱引用table:
1》具有弱引用key的table
2》具有弱引用value的table
3》同时具有两种弱引用的table
不管哪种类型的table,当一个key或value被回收,那么它们所在的整个条目都会从table中删除。
一个table的弱引用类型是通过元表中的__mode字段来决定的。这个字段的值为一个字符串:
“k” :表示key是弱引用的
“v":表示value是弱引用的
“kv”:表示key和value都是弱引用
下面的代码演示了弱引用table的基本行为:
a = {}
b = {__mode = "k" }
setmetatable(a,b) -- now 'a' 的key就是弱引用
key = {} -- 创建第一个key
a[key] =
key = {} --创建第二个key,覆盖第一个key(没有了引用,将会被回收)
a[key] = --引用了变量key
collectgarbage() --强制进行一次垃圾回收
for k , v in painrs(a) do
print(v) --
end
Lua只会回收弱引用table中的对象。而像数字和布尔这样的值是不可回收的。
如果一个数字key所对应的value被回收了,那么整个条目都会从这个弱引用table中删除。
字符串在此显得有点特殊:看上去是可回收的,但是在有些方面与其他可回收对象不同。
其他对象,比如table和thread,都是显式创建的。
当Lua对表达式{}求值时,它就会创建一个新的table。同样地,当对“a” .. "b"求值 会创建一个新的字符串吗?
如果当前系统中已有一个字符串"ab",它会复用吗?还是创建一个新的字符串?
这些都无关紧要,它们都是实现的细节。从程序员角度看,字符串就是值,而非对象。
因此,字符串就像数字和布尔一样,不会从弱引用table中删除(除非和它相关联的值被回收)。
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》
Chapter 17_1 弱引用table的更多相关文章
- Lua弱引用table
弱引用table 与python等脚本语言类似地,Lua也采用了自动内存管理(Garbage Collection),一个程序只需创建对象,而无需删除对象.通过使用垃圾收集机制,Lua会自动删除过期对 ...
- [Lua]弱引用table
参考链接: http://www.benmutou.com/archives/1808 一.强引用table lua中的table是引用类型,更准确地说,是强引用类型.如下第二段代码,在内存中有一个{ ...
- Step By Step(Lua弱引用table)
Step By Step(Lua弱引用table) Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃 ...
- Lua table之弱引用
Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃圾收集器是无法准确的判断是否应该将当前对象清理.这样 ...
- weak 弱引用的实现方式
来源:冬瓜争做全栈瓜 链接:https://desgard.com/weak/ 对于 runtime 的分析还有很长的路,最近在写 block 系列的同时,也回顾一下之前疏漏的细节知识.这篇文章是关于 ...
- OC对象之旅 weak弱引用实现分析
Runtime学习 -- weak应用源码学习 Runtime源码分析,带你了解OC实现过程.其中参考了大量的大神的代码以及文献,里面也有个人的见解,欢迎拍砖,欢迎交流. 两种常见使用场景 /// ...
- HashMap 之弱引用 - WeakHashMap
■ Java 引用的相关知识 1. 强引用 Object o = new Object(); 强引用是Java 默认实现 的引用,JVM会尽可能长时间的保留强引用的存在(直到内存溢出) 当内存空间不足 ...
- IOS 看懂此文,你的block再也不需要WeakSelf弱引用了!
前言: 最近都在折腾 Sagit 架框的内存释放的问题,所以对这一块有些心得. 对于新手,学到的文章都在教你用:typeof(self) __weak weakSelf = self. 对于老手,可能 ...
- WeakHashMap<K,V> 中的弱引用
相信很多人对WeakHashMap并没有完全理解. WeakHashMap 持有的弱引用的 Key. 1. 弱引用的概念: 弱引用是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次垃圾收集发生 ...
随机推荐
- sql基础篇
再跟SQL谈一谈--基础篇 1.简介 2.DDL & DML 3.SELECT ①DISTINCT ②WHERE ③AND & OR ④ORDER BY 4.INSERT 5.UP ...
- GitHub上搭建个人网站
大致如下步骤: 1.注册Git账号 2.创建SSH keys 3.新建repository --- 4.设置网站 5.clone库到本地 6.提交.上传 7.预览 本教程默认你了解GitHub的基础之 ...
- 给Amazon ec2 增加卷(Volume)并挂载到系统
给Amazon ec2 增加卷(Volume)并挂载到系统 前言 导师让师弟把实验的网站挂到亚马逊的EC2云服务器上.师弟对linux不太熟悉.就跑过来问我.于是花了一个小时搞定.问题主要是将EC2的 ...
- 新手教程:wordpress博客安装图文教导
每一个建立博客的新朋友,当准备好域名和主机后,不知道怎么安装博客,我刚建立昆明SEO的时候,也费了很多时间,终于搭建成功,下面是我一步一步实战得来的总结. 第一步:域名解析,根据域名注册商不同,解析操 ...
- 搭建基于SSI(struts2,spring,ibatis)的javaEE开发环境
搭建基于SSI(struts2,spring,ibatis)的javaEE开发环境 最近有很多人不知道如何搭建基于SSI(struts2,spring,ibatis)的J2EE开发环境,这里给大家一个 ...
- 性能测试工具比较:LoadRunner vs JMeter - 测试结果数据比较
对web请求(HTTP/HTML)进行性能测试,确认请求响应时间.分别使用Loadrunner和JMeter进行测试,比较测试结果. 1.LoadRunner测试web请求响应时间 1.1 编制(录 ...
- 用友CDM系统“货位间商品移库单(一步)”表体增加“货位可用数量”字段,根据表头的选择的货位自动带出数值
系统控制台——业务单据定制——货位间商品移库单(一步) 明细字段——增加“可销数量”字段. 然后修改明细字段的“商品编号”自定义查询方案. 增加自定义资料检索方案hwyksp SQL: select ...
- 在OpenStack虚拟机实例中创建swap分区的一种方法
测试组里一个同学负责MapR的搭建,MapR文档中建议每个节点上至少有24GB的swap分区,不知道MapR为啥会有这种反人类的建议……swap无非就是一块顺序读写的磁盘空间,莫非省着内存不用,用sw ...
- setprecision、fixed、showpoint的用法总结(经典!!超经典!!)
首先要加头文件:iomanip 一:setprecision 作用:控制输出流显示浮点数的数字个数,setprecision(n)就是输出的n个数,会有四舍五入. 比如:double s=20.784 ...
- iOS开发: 关于Certificate, Identifier & Profile
简介 苹果的iOS系统是封闭的系统.苹果的设计是保证每一个软件有确定的开发者/厂商(保证不被第三方进行未授权修改),只能在指定的设备上运行.为达到这些目标,苹果设计了一系列的机制. Certifica ...