function __G__TRACKBACK__(msg )
print---------------------------- ' )
打印(Lua error : )…tostring (msg )…(n ) ) )。
-打印(debug.trace back () ) ) ) ) ) ) ) )。
print---------------------------- ' )
结束
本地功能主(
--Avoid内存leak
collectgarbage(setpause ),100 )。
collectgarbage(setstepmul ),5000 )。
-require(mobdebug ) (.start ) ) )。
game=require('game );
game:startup (;
结束
XPcall(main,__G__TRACKBACK__ )
1.collectgarbage关键字---英语(garbage垃圾collect收集)---简称GC
collectgarbage的用法是collectgarbage('AAA ' ),根据AAA的不同,值表示的含义也不同
2 .为什么下面两个词会放在main的开头?
collectgarbage(setpause ),100 )。
collectgarbage(setstepmul ),5000 )。
網上搜索的結果展示
查看两个代码时,他们最大的区别在于一个是全局变量,另一个是局部局部变量。
与调用test2之前相比,即使Lua进行内存循环,内存也不会下降,因此该300k(25906k-25620k )内存存储在全局函数中,永远没有机会回收!
总结一:如何监测Lua的编程产生内存泄露:
1 .对于发生泄漏的函数,调用collectgarbage('count ' )获取第一个内存使用量
2 .函数调用后,collectgarbage('collect ' )进行采集,使用collectgarbage('count ' )重新获取当前内存,最后记录两次使用差异
从test1的收集可以看出,collectgarbage('collect ' )被调用,并不保证一次成功,因此可以多次调用
总结二:如何避免Lua应用中出现的内存使用过大行为:
1 .当然不漏代码实现。 (无厘头(*%$ ) ) ) ) ) ) ) ) ) )。
2 .测试还发现,实际上分配给Lua的内存实际上不会自动回收。 因此,就我个人而言,我认为要么Lua虚拟机没有这样做,要么回收的时机在c层。 因此,为了避免内存过大,在执行APP应用程序时,可能需要周期性地调用(Collectgarbage )或collect。
作为开发人员,我们确实有过让Lua自动内存管理。为此,有以下几种方法。
collectgarbage(opt )、arg )功能:是垃圾收集器的通用接口,用于操作垃圾收集器的参数。 opt )停止操作方法标志' Stop':垃圾收集器。 收集器仅通过显式调用运行,直到调用重新启动。 重新启动“Restart':垃圾收集器运行一次“Collect':垃圾回收周期“Count':返回当前Lua使用的内存量(以千字节为单位)。 返回Lua使用的内存总数(以kb为单位)。 由于该值有小数部分,因此只需乘以1024即可获得Lua使用的准确字节数。 ' Step':单步执行垃圾回收。 步骤' Size '由参数arg指定。 较大的值可以多步完成。 为了准确地指定步骤,需要进行多次实验以获得最佳结果。 步骤完成一个收集周期后,返回True 'Setpause':并将arg/100的值设置为初步收集的时间。 将arg设置为收集器的间歇率。 返回间歇率之前的值。 “Setstepmul':将arg/100的值设置为步长的放大率。 也就是说,新的步骤=旧的步骤*arg/100 )。 返回步进倍率之前的值。
示例: collectgarbage(setpause ),100 (collect garbage ) (setstepmul ),5000 ) )。