LuaInterface 内存泄漏问题

我发现在一个C#/Lua LuaInterface项目中存在着一个严重的内存泄漏问题。我已经编写了一个简单的测试函数在C#中,每0.5秒从Lua中循环调用一次。我可以看到Lua的内存使用量随着每个循环的增加而增加。我最新的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

如果您能帮助我解决内存泄漏问题,我将不胜感激。

再次感谢

Geoff

点赞
用户7427126
用户7427126

简短回答

用以下代码代替 lua.newTable("testTable")

lua.doString("for key,value in ipairs(testTable) do testTable[key]=nil end");

这样就不会出现内存泄漏了,你的代码也能正常工作。

详细回答

假设你有以下 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 实例加载了多个版本的表。

2017-01-16 20:47:43