[Lua]內存泄漏與垃圾回收


參考鏈接:

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判定為垃圾,就能進行回收了。因此,可以得出一個減少內存泄漏的方法:盡量用局部變量,這樣當其生命周期結束時,就能被回收;對於全局變量,可以根據使用情況置空,及時回收內存。另外,如果某些情況出現或即將出現內存占用過大的情況,可以考慮手動去進行垃圾回收。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM