2013-11-22 67 views
5

我對LUA表的使用內存泄漏問題,代碼如下:Lua表內存泄漏?

function workerProc() 
    -- a table holds some objects (userdata, the __gc is implememted correctly) 
    local objs = {createObj(), createObj(), ...} 
    while isWorking() do 
     -- ... 
     local query = {unpack(objs)} 
     repeat 
      -- ... 
      table.remove(query, queryIndex) 
     until #query == 0 
     sleep(1000) 
    end 
end 

objs與一些用戶數據對象初始化,這些對象都可以在while循環所以沒有GC將可用在這些目標上執行。在while循環中,query表使用來自objs的所有元素進行初始化(使用解壓函數)。在運行腳本時,我發現內存不斷增加,但當我註釋掉local query = {unpack(objs)}時,它消失了。

我不認爲這段代碼有內存泄漏問題導致query var是本地的,它應該在while循環的每次迭代後都不可用,但事實是。任何人都知道爲什麼內存被這個表所吞噬?

回答

6

從你的代碼示例判斷,你看到的可能的解釋可能是gc沒有機會在循環內執行完整的收集週期。

可以使用collectgarbage()強制集合內循環之後,看看是否能解決內存問題:

while isWorking() do 
    -- .. 
    local query = {unpack(objs)} 
    repeat 
     -- .. 
     table.remove(query, queryIndex) 
    until #query == 0 
    collectgarbage() 
    sleep(1000) 
end 

另一種可能性是,一旦移動local query外循環並創建表,而不是創建的outter循環中每次迭代的新表。

+1

謝謝!我認爲更好的方法是將查詢表移出內部循環。 – Kery