2013-11-22 2 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 инициализируется с некоторыми объектами USERDATA и эти объекты всегда доступны в цикле пока так не дс будет выполненных на этих объектах. В цикле 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 вне цикла и создать таблицу один раз вместо создания новая таблица на каждой итерации в петле.

+1

Спасибо! Я думаю, что лучший способ - переместить таблицу запросов из внутреннего цикла. – Kery

Смежные вопросы