參考鏈接:
http://colen.iteye.com/blog/578146
一.內存泄漏的檢測
Lua的垃圾回收是自動進行的,但是我們可以collectgarbage方法進行手動回收。collectgarbage方法的第一個參數是字符串,代表操作類型,第二個參數只有某些操作類型有,是該操作所需要的參數。常用的操作類型有:
collect:執行一次完整的垃圾回收
count:返回當前使用的內存,單位是kb
1 function PrintCount() 2 print("內存為:", collectgarbage("count"))--輸出當前內存占用 3 end 4 5 function A() 6 collectgarbage("collect")--進行垃圾回收,減少干擾 7 PrintCount() 8 local a = {} 9 for i=1,5000 do 10 table.insert(a, {}) 11 end 12 PrintCount() 13 collectgarbage("collect") 14 PrintCount() 15 end 16 17 A() 18 PrintCount() 19 collectgarbage("collect") 20 PrintCount()
輸出如下。第二次輸出,可以得出分配內存為303-19=284kb。第三次輸出,因為局部變量a還在生命周期內,所以手動回收內存並沒有影響。第四次輸出,因為Lua的自動回收是每隔一段時間進行的,所以無影響。第五次輸出,在執行手動回收后,分配的內存得到了回收,沒有發生內存泄漏。
接着對上面的例子進行少量修改:
1 function PrintCount() 2 print("內存為:", collectgarbage("count"))--輸出當前內存占用 3 end 4 5 function A() 6 collectgarbage("collect")--進行垃圾回收,減少干擾 7 PrintCount() 8 a = {}--修改1 9 for i=1,5000 do 10 table.insert(a, {}) 11 end 12 PrintCount() 13 collectgarbage("collect") 14 PrintCount() 15 end 16 17 A() 18 PrintCount() 19 collectgarbage("collect") 20 PrintCount() 21 22 --修改2 23 a = nil 24 collectgarbage("collect") 25 PrintCount()
輸出如下。第五次輸出,因為a改為了全局變量,所以沒辦法進行回收。如果之后再也不需要使用a,那么就出現了內存泄漏了。為了避免這種情況,可以將a置空,此時a就會被lua判定為垃圾,就能進行回收了。因此,可以得出一個減少內存泄漏的方法:盡量用局部變量,這樣當其生命周期結束時,就能被回收;對於全局變量,可以根據使用情況置空,及時回收內存。另外,如果某些情況出現或即將出現內存占用過大的情況,可以考慮手動去進行垃圾回收。