每天一点点----项目中關鍵字 “ collectgarbage”

每天一点点----项目中關鍵字 “ collectgarbage”,第1张

概述function __G__TRACKBACK__(msg)     print("----------------------------------------")     print("LUA ERROR: " .. tostring(msg) .. "\n")     -- print(debug.traceback())     print("----------------------
 

function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")
-- print(deBUG.traceback())
print("----------------------------------------")
end

local function main()
-- avoID memory leak
collectgarbage("setpause",100)
collectgarbage("setstepmul",5000)

-- require('mobdeBUG').start()

game = require("game");
game:startup();
end

xpcall(main,__G__TRACKBACK__)


1.collectgarbage 关键词 -- 英文(garbage 垃圾 collect 收集) -- 简称 GC

collectgarbage的使用方法是collectgarbage("AAA"),AAA 不同的值代表的意思也不一样


2.為什麼下面這兩句話要放在main的開頭?

collectgarbage("setpause",5000)



網上搜索的結果展示

看两段代码 ,他们最大的区别就是一个是全局变量,另一个是本地局部变量。


跟调用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"))进行显式回收。


作为开发人员,我们确实有过让Lua自动内存管理。为此,有以下几种方法。

collectgarbage(opt[,arg])
  功能:是垃圾收集器的通用接口,用于 *** 作垃圾收集器
  参数:
  opt: *** 作方法标志
  "Stop":停止垃圾收集器。在调用重启前,收集器只会因显式的调用运行。
  "Restart":重启垃圾收集器
  "Collect":执行一次全垃圾收集循环
  "Count":返回当前Lua中使用的内存量(以KB为单位)。以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)
  "Step":单步执行一个垃圾收集.步长"Size"由参数arg指定 (大型的值需要多步才能完成),如果要准确指定步长,需要多次实验以达最优效果。如果步长完成一次收集循环,将返回True
  "Setpause":设置arg/100的值作为暂定收集的时长。将 arg 设为收集器的 间歇率 。 返回 间歇率 的前一个值。
  "Setstepmul":设置arg/100的值,作为步长的增幅(即新步长=旧步长*arg/100)。返回 步进倍率 的前一个值。
例子: collectgarbage("setpause",100)
collectgarbage("setstepmul",5000)
总结

以上是内存溢出为你收集整理的每天一点点----项目中關鍵字 “ collectgarbage”全部内容,希望文章能够帮你解决每天一点点----项目中關鍵字 “ collectgarbage”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077450.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存