lua内存泄露

1、注意全局定义和local定义 用全局容易造成内存泄露

function test2()

print("========================start==============================")
   collectgarbage("collect")--为了有干净的环境,先把可以收集的垃圾收集了
   collectgarbage()--为了保证内存的收集的相对干净,及内存的稳定,要执行多次收集
   print("now,Lua内存为:",collectgarbage("count")) 
   local colen = {} --现在是全部变量
   for i=1,5000 do
       table.insert(colen,{})
   end
   print("now,Lua内存为:",collectgarbage("count"))
   --创建5000个table,内存增加了414 KB;这些增加的内存,由于已放到了全局函数中,是永远没有机会被回收到了!
end
 
function collect2()
print("now,Lua内存为:",collectgarbage("count"))
   collectgarbage()
   collectgarbage()
   collectgarbage()
   print("now,Lua内存为:",collectgarbage("count"))


   print("========================end==============================")
end

test2()

collect2()



如果 local colen = {} 变成colen = {} 将造成约5000个{}的内存泄露 除非手动将colen=nil 制空 




回收函数:

collectgarbage函数提供了多项功能:停止垃圾回收重启垃圾回收强制执行一次回收循环强制执行一步垃圾回收获取Lua占用的内存,以及两个影响垃圾回收频率和步幅的参数。collectgarbage(opt,[,arg])

"stop"

停止垃圾收集器,如果它的运行。

"restart"

如果垃圾收集器已经停止,将重新启动它。

"collect"

执行一次全垃圾收集循环。默认执行此操作

"count"

返回当前Lua中使用的内存量(以KB为单位)

"step"

单步执行一个垃圾收集. 步长 "Size" 由参数arg指定 (大型的值需要多步才能完成),如果要准确指定步长,需要多次实验以达最优效果。如果步长完成一次收集循环,将返回True

"setpause"

设置 arg/100 的值作为暂定收集的时长;并返回设置前的值。默认为200

控制了收集器在开始一个新的收集周期之前要等待多久。 随着数字的增大就导致收集器工作工作的不那么主动。 小于 1 的值意味着收集器在新的周期开始时不再等待。 当值为 2 的时候意味着在总使用内存数量达到原来的两倍时再开启新的周期。

"setstepmul"

设置 arg/100 的值,作为步长的增幅(即新步长=旧步长*arg/100);并返回设置前的值。默认为200

控制了收集器的工作速度,这个速度是一个相对于内存分配的速度。更大的数字将导致收集器工作的更主动的同时,也使每步收集的尺寸增加。 小于 1 的值会使收集器工作的非常慢,可能导致收集器永远都结束不了当前周期。 缺省值为200%,这意味着收集器将以内存分配器的两倍速运行。


lua垃圾回收机制:

Lua的垃圾收集机制使用了名为标志和清扫(Mark-and-Sweep)的方式。


一 回收机制
基础的Mark-and-Sweep算法是最古老的解决循环引用情况垃圾收集算法之一。
顾名思义,这是一个two phases的算法,可用很简单的文字描述:
(1)Mark phase(标志阶段)
1> 每个可被gc的对象都拥有一个标志位,初始为0(unmarked)。
2> 定义程序中第一层可访问的对象集合为 根对象集合(root set)。
3> 递归遍历根集合中所有对象的引用关系,如果某对象标志位为unmarked,
则标志为1(marked)。


(2)Sweep phase(清扫阶段)
1> 遍历所有现存的对象:将标志位还是unmarked的对象释放;
同时将标志为marked的对象重新标志为unmarked,为下次gc做准备。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值