参考链接:

http://colen.iteye.com/blog/578146

一.内存泄漏的检测

Lua的垃圾回收是自动进行的,但是我们可以collectgarbage方法进行手动回收。collectgarbage方法的第一个参数是字符串,代表操作类型,第二个参数只有某些操作类型有,是该操作所需要的参数。常用的操作类型有:

collect:执行一次完整的垃圾回收

count:返回当前使用的内存,单位是kb

 function PrintCount()
print("内存为:", collectgarbage("count"))--输出当前内存占用
end function A()
collectgarbage("collect")--进行垃圾回收,减少干扰
PrintCount()
local a = {}
for i=, do
table.insert(a, {})
end
PrintCount()
collectgarbage("collect")
PrintCount()
end A()
PrintCount()
collectgarbage("collect")
PrintCount()

输出如下。第二次输出,可以得出分配内存为303-19=284kb。第三次输出,因为局部变量a还在生命周期内,所以手动回收内存并没有影响。第四次输出,因为Lua的自动回收是每隔一段时间进行的,所以无影响。第五次输出,在执行手动回收后,分配的内存得到了回收,没有发生内存泄漏。

接着对上面的例子进行少量修改:

 function PrintCount()
print("内存为:", collectgarbage("count"))--输出当前内存占用
end function A()
collectgarbage("collect")--进行垃圾回收,减少干扰
PrintCount()
a = {}--修改1
for i=, do
table.insert(a, {})
end
PrintCount()
collectgarbage("collect")
PrintCount()
end A()
PrintCount()
collectgarbage("collect")
PrintCount() --修改2
a = nil
collectgarbage("collect")
PrintCount()

输出如下。第五次输出,因为a改为了全局变量,所以没办法进行回收。如果之后再也不需要使用a,那么就出现了内存泄漏了。为了避免这种情况,可以将a置空,此时a就会被lua判定为垃圾,就能进行回收了。因此,可以得出一个减少内存泄漏的方法:尽量用局部变量,这样当其生命周期结束时,就能被回收;对于全局变量,可以根据使用情况置空,及时回收内存。另外,如果某些情况出现或即将出现内存占用过大的情况,可以考虑手动去进行垃圾回收。

[Lua]内存泄漏与垃圾回收的更多相关文章

  1. Java的内存泄漏和垃圾回收机制

    JAVA会产生内存泄露吗?首先,答案是肯定的. Java尽管有垃圾回收器,但依旧存在泄漏. Java内存泄漏跟C/C++内存泄漏的概念不一样:C/C++的内存泄漏是指Malloc了一些资源.最后没有f ...

  2. 【JS档案揭秘】第一集 内存泄漏与垃圾回收

    程序的运行需要内存,对于一些需要持续运行很久的程序,尤其是服务器进程,如果不及时释放掉不再需要的内存,就会导致内存堆中的占用持续走高,最终可能导致程序崩溃. 不再需要使用的内存,却一直占用着空间,得不 ...

  3. Java中内存泄露及垃圾回收机制

    转自:http://blog.sina.com.cn/s/blog_538b279a0100098d.html 写的相当不错滴...................... 摘  要 Java语言中,内 ...

  4. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  5. JVM内存管理及垃圾回收

    一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...

  6. javascript中的内存管理和垃圾回收

    前面的话 不管什么程序语言,内存生命周期基本是一致的:首先,分配需要的内存:然后,使用分配到的内存:最后,释放其内存.而对于第三个步骤,何时释放内存及释放哪些变量的内存,则需要使用垃圾回收机制.本文将 ...

  7. JVM内存管理及垃圾回收【转】

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  8. .NET基础 (05)内存管理和垃圾回收

    内存管理和垃圾回收1 简述.NET中堆栈和堆的特点和差异2 执行string abc="aaa"+"bbb"+"ccc"共分配了多少内存3 ...

  9. 浅谈JVM内存分配与垃圾回收

    大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...

随机推荐

  1. 阅读DMA Controller Core 官方手册

    阅读DMA Controller Core 官方手册 DMA控制器框架图 怎样去设定一个DMA控制器 实例化DMA控制器 参数配置界面如下图所示: 对于width of the DMA length ...

  2. Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?

    分布式调用链跟踪系统,属于监控系统的一类.系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务.组件构成,用户请求过来后,可能会经过其中多个服务,如图 不过,出问题时往往很难排查,如整个请求变慢 ...

  3. influxDB硬件配置指南

    原地址:https://docs.influxdata.com/influxdb/v1.6/guides/hardware_sizing/ 警告!此页面记录了不再积极开发的InfluxDB的早期版本. ...

  4. TeamViewer 的早期版本下载

    对于10及上以的:https://www.teamviewer.com/zhcn/download/previous-versions/ 5~9的版本下载:https://community.team ...

  5. tomcat源码 Container

    1.Container的有四个子容器,分别是Engine,Host,Context,Wrapper,如下: 1.Engine:整个Catalina servlet引擎,标准实现为StandardEng ...

  6. 【java】之正则表达式摘要

    构造 匹配 字符 x 字符 x \\ 反斜线字符 \0n 带有八进制值 0 的字符 n (0 <= n <= 7) \0nn 带有八进制值 0 的字符 nn (0 <= n < ...

  7. DB2日志清理

    1.在windows系统中,DB2 日志db2diag.log 在什么地方? 以下是IBM网站上的解答 Question Where is db2diag.log for DB2 V9.5 locat ...

  8. JS中模态窗口(showModalDialog)的详细使用

    基本介绍: showModalDialog() (IE + 支持) showModelessDialog() (IE + 支持) window.showModalDialog() 方法用来创建一个显示 ...

  9. 服务网关zuul之四:zuul网关配置

    禁用过滤器在Zuul中特别提供了一个参数来禁用指定的过滤器,该参数的配置格式如下:zuul.AccessFilter.pre.disable=true动态加载动态路由通过结合Spring Cloud ...

  10. spring4.0之六:Generic Qualifier(泛型限定)

    Spring 4.0已经发布RELEASE版本,不仅支持Java8,而且向下兼容到JavaSE6/JavaEE6,并移出了相关废弃类,新添加如Java8的支持.Groovy式Bean定义DSL.对核心 ...