遇到问题:
在运行lua脚本时,出现下面报错说内存不足:

>lua -e "io.stdout:setvbuf 'no'" "最大值最小值检查.lua"
lua: not enough memory
>Exit code: 1

原因是,lua解释器是32位的,它的内存大小只有2GB,当它内存不够时就会出现上述提示。lua语言虽然会自己回收释放掉的资源,但是,它的回收机制并不是实时回收的,而是,他会将脚本中无用了的变量进行标记,然后等到一个合适的机会进行回收。所以当循环次数特别多时,就有可能造成内存不足。

我们可以验证一下是否是这个原因:
我在代码循环中加入了 check.LogError(string.format("内存占用:%s", collectgarbage("count")))【后面介绍】,运行显示:


有上图可知,大概在内存占用 1737872.5029297KB(大概为1.7G左右)时 显示内存不足,所以上面的结论是正确的。其实lua中提供了垃圾回收函数——collectgarbage()。用户可以强制清除无用的垃圾数据。

所以,我在代码种每次for循环一次强行清理一次垃圾:

--for循环每循环一次调用该函数清理一次垃圾
function MemoryCollect()if collectgarbage("count") > 1500000 thencheck.LogError(string.format("内存占用已接近临界值,请注意修改用例:%s", collectgarbage("count")))collectgarbage("collect")check.LogError("内存清理成功")end
end!

脚本运行成功。

lua垃圾回收机制:
lua虽然会自己回收无用数据,但同时它还提供了回收函数——collectgarbage()。它的函数原型为:

collectgarbage(opt,[,arg])

其中opt参数有下面7种操作:
1、collectgarbage(“stop”):停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。

2、collectgarbage(“restart”): 如果垃圾收集器已经停止,将重新启动它。

3、collectgarbage(“collect”):执行一次全垃圾收集循环,默认执行此操作。

4、collectgarbage(“count”):以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。

5、collectgarbage(“step”):单步运行垃圾收集器。 步长”大小”由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。

6、collectgarbage(“setpause”):将 arg/100设为收集器的间歇率。返回 间歇率 的前一个值。默认为200。控制了收集器在开始一个新的收集周期之前要等待多久。 随着数字的增大就导致收集器工作工作的不那么主动。小于 1 的值意味着收集器在新的周期开始时不再等待。 当值为 2 的时候意味着在总使用内存数量达到原来的两倍时再开启新的周期。

7、collectgarbage(“setstepmul”): 返回 步进倍率 的前一个值。
作为步长的增幅(即新步长=旧步长*arg/100);并返回设置前的值。默认为200。控制了收集器的工作速度,这个速度是一个相对于内存分配的速度。更大的数字将导致收集器工作的更主动的同时,也使每步收集的尺寸增加。小于 1 的值会使收集器工作的非常慢,可能导致收集器永远都结束不了当前周期。
缺省值为200%,这意味着收集器将以内存分配器的两倍速运行。

总结:
监测Lua的编程产生内存泄露:
1. 针对会产生泄露的函数,先调用collectgarbage(“count”),取得最初的内存使用
2. 函数调用后, collectgarbage(“collect”)进行收集, 并使用collectgarbage(“count”)再取得当前内存, 最后记录两次的使用差
3. 从test1的收集可看到, collectgarbage(“collect”)被调用,并不保证一次成功, 所以, 大可以调用多次

避免Lua应用中出现的内存使用过大行为:
1. 防止代码出现泄露
2. 其实,Lua中被分配的内存,并不会及时的自动回收, 所以, 为了避免内存过大, 应用的运行时,可以定期的(调用collectgarbage(“collect”),又或者collectgarbage(“step”))进行显式回收。

Lua中的垃圾回收机制相关推荐

  1. 简述python垃圾回收机制_python中的垃圾回收机制简述

    2020年12月5日21:47:35 王凯玉 python中的垃圾回收机制 引用计数 # 引用计数 引用计数是编程语言中的一中内存管理技术,可以将资源的被引用次数保存起来. 当引用计数为0时,资源将被 ...

  2. 浅谈V8引擎中的垃圾回收机制

    浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...

  3. Java Jvm 中的垃圾回收机制中的思想与算法 《对Java的分析总结》-四

    Java中的垃圾回收机制中的思想与算法 <对Java的分析总结>-四 垃圾回收机制 中的思想与算法 引用计算法 给对象中添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失 ...

  4. js中的垃圾回收机制

    js中的垃圾回收机制 1.什么是堆.栈 一种数据结构,栈有先进后出的特性, 堆是用来存放复杂数据类型的地址(栈用来存放它的引用) 2.执行上下文与作用域链 执行上下文:全局执行上下文.函数执行上下文. ...

  5. 一篇文章搞定java中的垃圾回收机制面试题

    一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新 ...

  6. JAVA中的垃圾回收机制以及其在android开发中的作用

    http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...

  7. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  8. python有向图_Python 中的垃圾回收机制

    一.概述 python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略. 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的 ...

  9. java和net共同点,Java和.NET中的垃圾回收机制比较

    相同点: 都采用了分代的机制. 都支持并发GC. 都没有采用引用计数方式,而是采用了追踪技术. .NET中,可以通过代码GC.Collect() 强制要求CLR进行垃圾回收(由于垃圾回收是异步的,CL ...

最新文章

  1. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析
  2. 关于设置GridControl属性在代码中的顺序带来的不同效果
  3. html怎样添加日历控件,向日历控件中添加自定义内容
  4. Java内功修炼系列一工厂模式
  5. mybatis-generator 详细配置及使用,爬坑记录
  6. 图片相框展示的设计与实现
  7. 区块链安全的奥秘之一:非对称加密
  8. Bailian2811 熄灯问题【暴力】
  9. 关于Adobe软件安装失败的各类错误代码BUG汇总!!
  10. java服务端验证框架_SpringBoot服务端数据校验过程详解
  11. linux chmod命令
  12. html引入阿里在线css文件夹,阿里字体css代码引入方法
  13. “字符串的展开”【题解】
  14. 兼容Android 11 相机拍照,从相册中选择,裁剪图片
  15. 计算机基础理论科学家,科学家新理论:人类生活于计算机模拟程序中
  16. [风一样的创作]二次封装阿里云短信 验证码 发送短信 查询短信 编辑短信
  17. Spring 02
  18. dataframe python,使用pandas dataframe python创建实时更新图
  19. PyQt5_pyqtgraph股票蜡烛图与常用均线
  20. python画雷达图-python 雷达图

热门文章

  1. 2023年全国最新安全员精选真题及答案47
  2. IDEA中去掉参数标记
  3. Youtobe前端克隆模板(html + CSS + JavaScript)
  4. [设计模式] javascript 之 责任链模式
  5. [EOS源码分析]6.EOS特殊智能合约eosio
  6. Part3_理解MATSIM_第51章 效益-成本分析中matsim的微观经济学解释
  7. 知行合一的学习网络技术
  8. 蓝桥杯练习系统:【试题 算法训练 最大质因数】
  9. Python+ITchart实现微信机器人对指定的朋友和群自动回复
  10. A Practical Guide to Quantitative Finance Interviews