Lua: изменилось ли поведение сборщика мусора в Lua 5.3.2? - PullRequest
1 голос
/ 26 сентября 2019

Я столкнулся с проблемой утечки памяти в Lua.Чтобы понять, как работает gc, я написал небольшой скрипт, и его результаты удивляют (для меня):

local mt = { __gc = function() end }

local function new()
    local o = { s = string.rep(os.date("%c"), 500) }
    setmetatable(o, mt)
end

local before = math.floor(collectgarbage("count"))
for i = 1, 100000 do new() end
local after = math.floor(collectgarbage("count"))
print(before, after)

Я создаю 100000 объектов, у каждого объекта есть метатаблица с функцией __gc.

В результате я получаю:

  • с Lua 5.2.4: 25 130 (25 КБ памяти в начале, 130 КБ в конце скрипта)
  • сLua 5.3.5: 25 17470

Lua 5.3.5 не очищает объекты, как это делал Lua 5.2.4.

Я использовал один и тот же сценарий в разных версиях Lua (5.3.0, 5.3.1, 5.3.2, 5.3.3, 5.3.5), и это поведение появляется, начиная с Lua 5.3.2.

Более удивительным является то, что, если я удалю функцию __gc, результатысовершенно одинаково для всех версий Lua.

Как вы думаете, я что-то упустил или это ошибка, представленная в Lua 5.3.2?

...