Я столкнулся с проблемой утечки памяти в 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?