Утечка памяти таблицы 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, поэтому gc не будет выполняться для этих объектов. В то время как цикл query таблица инициализируется всеми элементами из objs (используйте функцию распаковки). При запуске скрипта я обнаружил, что память продолжает увеличиваться, но когда я комментирую local query = {unpack(objs)} это исчезает.

Я не думаю, что у этого фрагмента кода проблема с утечкой памяти вызывает query var является локальным, и он должен быть недоступен после каждой итерации цикла while,но факт есть. Кто-нибудь знает, почему память поглощается этим столом?

1 ответов


судя по вашему примеру кода, вероятное объяснение того, что вы видите, возможно, gc не получает возможности выполнить полный цикл сбора, находясь внутри цикла.

вы можете заставить коллекцию сразу после внутреннего цикла с помощью collectgarbage() и посмотреть, решает ли это проблему с памятью:

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

еще одна возможность-двигаться local query вне цикла и создайте таблицу один раз вместо создания новой таблицы на каждой итерации в outter петля.