您的位置:首页 > 数据 >
测试代码:如何玩转Lua内存回收?
来源:CSDN 2023-01-04 08:40:02
Lua内存是自动收集的, 这点跟Java类似, 不被任何对象或全局变量引用的数据,将被首先标记为回收,不需要开发者做任何事情.但是,正如Java也会有内存泄露一样, Lua也会有, 只不过,跟C++的不同,它是由于代码执行所装载的资源,并没有被彻底销毁而导致,其中,最臭名昭著的就是不小心把局部变量声明成了全局变量(忘了加local修饰符)。 类似这样造成的内存泄露, 跟任何其他语言的内存泄露一样,容易产生,却难以察觉, 给开发的应用带来潜在的很大隐患.

那么, 有没有一些有效的解决办法, 来解决这个这个隐患呢, 答案就是collectgarbage. collectgarbage就是开放给Lua开发人员, 用于监听Lua的内存使用情况(collectgarbage("count")), 同时,它还提供了collectgarbage("collect"),允许在适当的时候进行显式的回收.


(资料图片仅供参考)

现在,通过测试代码来看看,如何玩转collectgarbage.

首先,为了有明显的对比, 先来看没有产生泄露的情况, 运行以下的test1(代码如下):

运行结果如下:

这里看到, 被local 声明的colen加了5000数组, test1调用后, 内存增加了大概300K(25906K-25620K). 现在,我们来做内存回收(调用mem函数, 代码如下):  运行结果: ( 为了保证内存的稳定,以上注意mem被调用了多次, 再第2次, 可以看到内存开始下降, 最后,大概在25618K稳定下来)  好了,  从最初的 25620K,  到回收后的 25618K,  两者并没有发生变化(还少了2K,嘿嘿, 这应该是误差了), 也就是说,函数test1的执行,并没有产生无法回收的内存,没有泄露出现.

好了,现在运行有泄露的test2(代码如下), test2跟test1相比,只有一处不同:就是colen被误声明为全局:

结果:

也就是说,内存也在25906K,跟test1几乎是相等, 好了,现在再调用回收(mem)函数,产生结果如下  为了保证函数回收被执行,这次,总共调用了7次mem函数(看以上打印行数), 那么,从上面的结果我们看, 很不幸, 从第1次,到最后第7次, 内存都还是稳定在25905K左右, 也就是说, 跟调用test2前相比,即使Lua进行了内存回收, 内存却不会将下来  看来 ,  这 300K(25906K-25620K) 内存 ,  由于已放到了全局函数中,是永远没有机会被回收到了!

总结一: 如何监测Lua的编程产生内存泄露:

1.       针对会产生泄露的函数,先调用collectgarbage("count"),取得最初的内存使用

2.       函数调用后, collectgarbage("collect")进行收集, 并使用collectgarbage("count")再取得当前内存, 最后记录两次的使用差

3.       从test1的收集可看到, collectgarbage("collect")被调用,并不保证一次成功, 所以, 大可以调用多次

总结二: 如何避免Lua应用中出现的内存使用过大行为:

1.       当然是代码实现不出现泄露, (废话*&%$()

2.       在测试中,其实还发现, Lua中被分配的内存,其实并不会自动回收(个人估计要么就是Lua虚拟机没有做这个事情,要么就是回收的时机是在C层), 所以, 为了避免内存过大, 应用的运行时,可能需要定期的(调用collectgarbage("collect"),又或者collectgarbage("step"))进行显式回收。

大小: 2.7 KB 大小: 6.3 KB 大小: 4.6 KB 大小: 5.7 KB 大小: 9.2 KB 大小: 2.3 KB 大小: 2.3 KB
关键词:
相关文章
12月第四周广东省煤炭价格小幅下跌-全球速看料

12月第四周广东省煤炭价格小幅下跌-全球速看料

  据广东省重要生产资料市场监测系统显示,上周(12月19日至12月25日),广东省煤炭均价14198元吨,价格环比下跌68%。原因分析:下游厂商煤更多

2023-01-03 10:55:28
陕煤运销集团今年累计煤炭销量同比增长12.8%-天天快资讯

陕煤运销集团今年累计煤炭销量同比增长12.8%-天天

  11月,陕煤运销集团销售煤炭21797万吨,铁路运输煤炭11558万吨,省内电煤供应1448万吨,保障了各矿区产销平衡和生产平稳,为省内外下游用更多

2023-01-03 09:54:16
2022年煤炭科技十大新闻

2022年煤炭科技十大新闻

  1、全球在建最大煤化工项目一次性开车成功,顺利产出聚酯级乙二醇产品陕煤集团榆林化学公司负责的全球在建最大煤化工项目现场  2022年10更多

2023-01-03 10:15:46
国家矿山安全监察局关于印发3项煤矿顶板管理规定的通知-每日快看

国家矿山安全监察局关于印发3项煤矿顶板管理规定

国家矿山安全监察局关于印发《强化煤矿炮采(高档普采)工作面顶板管理规定》等3项煤矿顶板管理规定的通知矿安〔2022〕135号各产煤省、自治区更多

2023-01-03 09:01:17
河南:全力做好迎峰度冬电力保障供应-今日要闻

河南:全力做好迎峰度冬电力保障供应-今日要闻

  国家能源局河南监管办公室消息,进入冬季以来,河南全省气温下降,采暖负荷持续增加,随着疫情防控政策优化调整,全社会用电负荷和用电量更多

2023-01-03 08:59:51
天津港自2021年以来首次进口散装煤炭-天天观天下

天津港自2021年以来首次进口散装煤炭-天天观天下

  近日,装载38万吨进口散装焦煤的哈丽尔轮缓缓靠泊在天津港中煤华能煤码头有限公司泊位上,天津南疆海关关员手持智慧水尺计重平台,乘坐拖更多

2023-01-03 09:04:44
12月国际高卡煤价整体下行 后期或将反弹

12月国际高卡煤价整体下行 后期或将反弹

  12月份,国际动力煤市场高卡煤价格整体呈下行趋势,但印尼低卡煤价格月环比小幅上涨。  澳大利亚市场来看,澳大利亚动力煤离岸价在12月更多

2023-01-03 08:54:24
田庄选煤厂实现原煤入选1000万吨-天天观热点

田庄选煤厂实现原煤入选1000万吨-天天观热点

  2022年12月27日,中国平煤神马集团田庄选煤厂实现原煤入选1000万吨,这是河南省第一家1000万吨的选煤厂,更是河南省唯一一家1000万吨的选更多

2022-12-30 15:02:16
内蒙古公司:“满格”保供 筑牢经济发展承重墙-天天速讯

内蒙古公司:“满格”保供 筑牢经济发展承重墙-

  能源保供事关区域经济社会发展、民生稳定大局,特别是党的二十大精神的开局之年,保供二字意义重大。内蒙古公司通过准确研判区域经济、民更多

2022-12-30 11:13:15
吕梁市煤炭先进产能占比达到85%

吕梁市煤炭先进产能占比达到85%

  今年以来,吕梁市以数字赋能加大智能化矿井建设,关闭退出落后产能870万吨,先后建成7座智能化煤矿、87处智能化采掘工作面,2座充填开采、更多

2022-12-30 10:18:00