Lua垃圾收集
Lua使用基于被内置在Lua某些算法的垃圾收集自动内存管理。可以自动内存管理的结果,作为一个开发者:
没有必要担心的对象分配内存。
无需释放他们时,不再需要可将其设置为nil。
Lua使用运行不时收集死的对象时,不再从Lua程序中访问垃圾收集器。
所有对象,包括表,用户数据,函数,线程,字符串等受自动内存管理。 Lua使用增量标记和使用两个数字来控制其垃圾回收周期即垃圾收集暂停和垃圾收集器的步骤事半功倍清除收集器。这些值是在百分比和100的值是常等于1。
垃圾收集暂停
垃圾收集停顿被用于控制多长时间的垃圾收集器需要等待,之前;它是由Lua的自动内存管理再次调用。数值低于100就意味着Lua中不会等待下一个周期。此值的类似地较高的值将导致垃圾收集器是缓慢的并且性质上较不积极。200表示该集合等待的总内存在使用中要开始一个新的周期开始前的两倍。因此,根据不同的性质和应用的速度,有可能要求改变该值来获得在Lua应用的最佳性能。
垃圾收集器的步骤事半功倍
这一步乘数控制垃圾收集在Lua程序的内存分配的相对速度。较大的步长值将导致垃圾收集器要更侵蚀性,同时也提高了垃圾收集的每个增量步的步长大小。值小于100可能经常导致避免垃圾收集器没有完成其周期和其一般不是优选的。默认值是200,这意味着垃圾收集器运行的两倍的内存分配的速度。
垃圾收集器函数
作为开发人员,我们确实有过让Lua自动内存管理。为此,有以下几种方法。
collectgarbage("collect"): 执行垃圾回收的一个完整周期。
collectgarbage("count"): 返回当前使用的千字节的程序内存量
collectgarbage("restart"): 如果垃圾收集器已经停止,将重新启动它。
collectgarbage("setpause"): 设置给定为第二参数除以100至垃圾收集器暂停变量的值。它的用途是作为讨论的一点上面。
collectgarbage("setstepmul"): 设置给定为第二参数除以100到垃圾步骤乘数的变量的值。它的用途是作为讨论的一点上面。
collectgarbage("step"): 运行垃圾回收的一步。第二个参数是越大step也会变大。在收集的垃圾将返回true,如果触发的步骤是一个垃圾收集周期的最后一步。
collectgarbage("stop"): 停止垃圾收集器,如果它的运行。
使用垃圾收集器例如一个简单的例子如下所示。
mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))
当我们运行上面的程序,会得到下面的输出。请注意,这样的结果会有所不同,由于在操作系统中,Lua自动内存管理功能可能也有差异。
20.9560546875
20.9853515625
0
19.4111328125
可以在上面的程序看出,一旦垃圾回收完成后,既可以减少使用内存。但是它也不是强制性的调用。即使我们不给调用,它也会自动在后一阶段在预定时间之后由Lua解释器执行。
显然我们可以改变,如果需要使用垃圾收集器的这些功能行为。这些功能提供了一点额外的能力,为开发者处理复杂情况。根据不同的内存需要执行程序类型,可能会或可能不会使用此功能。但在应用程序的内存使用情况,并在程序本身,以避免在部署后不想要对结果进行检查。
Lua垃圾收集的更多相关文章
- Lua 垃圾收集机制
1. 问题:一款用Lua做的游戏,玩了一段时间后会变卡 因为知道lua是有自动管理内存的机制,所以之前一直没有关注过lua内存的问题.所以今天好好的查看了lua垃圾收集机制.看了一下Lua的Garba ...
- Lua 基础之Weak Table(5)
Lua垃圾收集策略 Lua自动进行内存的管理.程序只能创建对象,而没有执行删除对象的函数.通过使用垃圾收集技术,Lua会自动删除那些失效的对象,也就是引用为0 的对象.但是呢?有些对象,引用没有指向它 ...
- Lua的API函数
1. 基础库 我们在整个教程中使用了各种主题下的基本库. 下表提供了相关页面的链接,并列出了本Lua教程各部分所涵盖的功能. 编号 库/方法 作用 1 错误处理 包括错误处理函数,如断言, 错误,如L ...
- Ulua对象管理方式
不管是C++中还是在C#中,在都绕不开一个问题:类对象怎么在Lua中使用的问题,还好Lua提供了Userdata以及ligh Userdata结构类型,通过扩展可以处理这方面的问题.现在的很多框架也大 ...
- Lua table之弱引用
Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃圾收集器是无法准确的判断是否应该将当前对象清理.这样 ...
- Lua 学习笔记(十一)元表与元方法
在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符 ...
- Lua 基础
Lua 5.3 的中文手册, http://cloudwu.github.io/lua53doc 在线浏览 --第一部分 -- 两个横线开始单行的注释 --[[ 加上两个[和]表示 多行的注释. -- ...
- 用Nginx+Lua(OpenResty)开发高性能Web应用
在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开 ...
- C++混合编程之idlcpp教程Lua篇(6)
上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...
随机推荐
- J2SE7规范_2013.2_类型_命名
3.1 字面量:包括整型,实型,字符,字符串,布尔,null 整形: 除非后面有个l或L,一般总是int类型 除非是0x,0,0b开头,一般总是十进制 无论什么进制,中间都可以有_,无意义,只是看 ...
- hadoop多次格式化后,导致datanode启动不了,怎么办?(伪分布式)
根据当初 hadoop 安装目录下 conf 目录的 core-site.xml 的设置,找到该目录: 进入该目录 在 data 和 name 文件夹下均有 current 文件夹 ,和 cur ...
- flot图表的使用
Flot是一套用Javascript写的绘制图表用的函式库, 专门用在网页上执行绘制图表功能, 由于Flot利用jQuery所以写出来的, 所以也称它为jQuery Flot ,它的特点是体积小.执行 ...
- 读取jar内的配置文件
读取jar包内的配置文件,可以使用ResourceBundle,具体具体例子如下 import java.io.BufferedInputStream; import java.io.IOExcept ...
- notepad++汉字突然横过来了
修改notepad++,汉字突然横过来了,如图, 百度了一下,原来是因为选择的字体"@微软雅黑"前面的@符号惹的祸,改成"微软雅黑"就没事了.
- 解决Failed to execute goal org.apache.maven.plugins
1.Maven构建失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin: 2.3 . 2 :compile ...
- [iOS UI进阶 - 1] 自定义控件
A.关于Quiartz2D的一些细节 1.UIKit的工具已经封装了上下文引用,所以不用手动获取和渲染 - (void)drawRect:(CGRect)rect { [[UIColor redCol ...
- Linux 系统监控和诊断工具:lsof
1.lsof 简介 lsof 是 Linux 下的一个非常实用的系统级的监控.诊断工具. 它的意思是 List Open Files,很容易你就记住了它是 “ls + of”的组合~ 它可以用来列出被 ...
- HDU 4597 Play Game (DP,记忆化搜索,博弈)
题意:Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个,只能从其中一个序列,选择两端中的一个拿走.他们都希望可以拿到尽量大的数字之和, 并且他们都足够聪明,每次都选择最优策略 ...
- vs2010生成Dll文件并引用dll(C#)
1.创建新C#控制台应用程序,项目命名createBll,打开Program.cs重命名为TestA(可以不重命名)并修改代码,如图: 写好后,可以写其它的类.cs文件 2.完成后,点击菜单栏的“项目 ...