lua内存管理及优化方式

lua内存管理:由于lua中有内存回收机制,所以本质上说lua与C/C++中的内存泄漏是不一样的,lua中有GC,理论上说是不会有内存泄漏的。当它进行GC的时候,会从根部开始扫描所有的对象,如果某个地方对这个对象还有引用,那么就不会把这个对象collect,这个对象就没有被GC,所以lua中的内存泄漏是指已经没有使用,但是外部依然还存在引用的对象。

Lua的GC算法使用的所谓的“Mark And Sweep”算法,简单理解,这个算法GC分为两个阶段,一个是标记(mark)阶段,这一阶段将所有系统中的引用的对象都逐一标记,而在清理(Sweep)阶段,把在mark阶段没有被标记的数据删除。

优化方法:1.尽量少使用全局变量,由于Lua默认是全局变量,所以很容易造成内存泄漏,尽量使用local限定。

2.在可能内存泄漏的地方先调用collectgarbage(“count”)获取内存的最初使用,然后在函数调用后进行collectgarbage(“collect”)收集,并使用collectgarbage(“count”)检测两次内存使用的差。或者手动进行显示的垃圾回收collectgarbage("step")

3.lua的弱引用__mode(table):因为如果一个table1里面还有一个table2对象,那么即使将这个table2对象赋值为nil,它依然不会被垃圾回收,因为table1还保存着这个对象的引用,而显然这部分的引用是没有用的。为了告诉GC,这一部分引用是没有必要的,所以需要将其标记为弱引用,以方便GC对其进行回收。

通过设置该表的元方法__model 为“k”或者是“v”,为“k”即可说明该表的key所引用的表是弱引用 ,为“v”说明该表的value所对应的表是弱引用。

可以参考博文:https://blog.csdn.net/jiumengdz/article/details/88427895

发布了58 篇原创文章 · 获赞 7 · 访问量 3720

猜你喜欢

转载自blog.csdn.net/xy_learning/article/details/104659161