我发现我在一个C#/Lua LuaInterface项目中有一个严重的内存泄漏。我用C#编写了一个简单的测试函数,它每隔0.5秒从Lua循环调用一次。我可以看到Lua memmory的使用率随着每个循环的增加而增加。我最新的C#端代码是
public LuaTable testMemTable()
{
LuaTable tabx = m_lua.GetTable("tabx");
if (tabx != null)
{
tabx.Dispose();
tabx = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
m_lua.NewTable("tabx");
tabx = m_lua.GetTable("tabx");
for (int i = 0; i < 20000; i++)
tabx[i] = i * 10;
return tabx;
}尽管执行了tabx.Dispose()和tabx=null,然后强制GC,但我仍然看到内存没有被释放。没有LuaInterface函数来释放以前分配的表,所以我不知道还能做些什么来释放内存?
Lua端代码非常简单
while true do
myAPILibs.testMemTable()
if tabx ~= nil then
print(string.format("Size = %d", #tabx))
else
print(string.format("Size = nil"))
end
print(tabx, tabx[111])
myAPILibs.sleep(500)
print("Before ", collectgarbage("count") * 1024)
collectgarbage("collect")
print("After ", collectgarbage("count") * 1024)
end任何帮助我解决内存泄漏问题的人都将不胜感激。
再次感谢
杰夫
发布于 2017-01-17 04:47:43
Short answer
将lua.newTable("testTable")替换为
lua.doString("for key,value in ipairs(testTable) do testTable[key]=nil end");
将不会有内存泄漏,并且您的代码运行良好。
Long answer
假设你有这样的lua脚本:
newTable = {1,2,3,4,5,6,7,8,9,10,11,12,13,14}
newTable = {} 如果您在Lua端执行此操作,即使您从未实际清除原始表,也不会发生泄漏。Lua不知何故知道在重新分配表之前先处理它。
但是,如果在将表设置为空表之前有任何对它的C#引用,即使lua处理了它的内容,C#引用也不会被处理;显然,它的行为就像实例创建了一个全新的表一样。要重置该表,您需要执行以下操作:
for key,value in ipairs(testTable) do
testTable[key] = nil
end您的问题并不是真正的内存泄漏,而是您的静态Lua实例正在加载多个版本的表,因为它的重置方式。
https://stackoverflow.com/questions/40456209
复制相似问题