我正在使用 NLua 从 C# 编译 lua 代码。问题是在 C# 中创建的 LuaTables 不能被 Lua 垃圾收集器完全处理掉。
这是示例代码:
public static List<LuaTable> TempTables = new List<LuaTable>();
static void Main(string[] args)
{
using (Lua lua = new Lua())
{
double mem = (double)lua.DoString("return collectgarbage(\"count\")")[0];
for (int i = 0; i < 100000; i++)
{
LuaTable lt = NewTab(lua);
}
mem = (double)lua.DoString("return collectgarbage(\"count\")")[0];
foreach (LuaTable lt in TempTables)
{
lt.Dispose();
}
TempTables.Clear();
lua.DoString("collectgarbage()");
mem = (double)lua.DoString("return collectgarbage(\"count\")")[0];
}
}
public static LuaTable NewTab(Lua l)
{
LuaTable lt = (LuaTable)l.DoString("return {}")[0];
TempTables.Add(lt);
return lt;
}
这段代码简单地创建了 100 000 个表,然后在 C# 中处理它并在 lua 中调用垃圾收集。使用的内存可以在变量“mem”中检查。结果是“mem”将从 22.04Kb 增加到大约。1000KB。这意味着以这种方式处理会导致内存泄漏。
但是,如果我们立即处理 LuaTable:
for (int i = 0; i < 100000; i++)
{
LuaTable lt = NewTab(lua);
lt.Dispose();
}
它运作良好。“mem”保持不变+-1Kb。
为什么会这样?我应该如何处理 Lua 对象以使其完全可供 lua gc 访问?