为什么MoonSharp DoString泄漏内存?

时间:2016-06-15 07:29:31

标签: c# .net memory-leaks lua

我在.NET 4.6下使用MoonSharp(1.6.0,刚更新,在它之前遇到了问题)。我有以下C#代码:

public class LuaCore {
    public static Script script = new Script();
    public static DynValue Call(string func)
    {
        return script.DoString(func);
    }
}

似乎只要我调用LuaCore.Call("any code"),程序就会使用额外的~1.5千字节。这也发生在any codestuff = nil,因此"任何代码"。
当每秒调用约3500次时,每五秒使用一次额外的25兆字节,每秒呼叫取决于机器的功率。由于每次更新都会使用多次调用,因此程序的内存使用量也会增加得更快(测试过)。 5分钟后,我得到一个OutOfMemoryException(使用了1.4GB) 我使用1.5GB内存的应用程序拍摄了堆的快照。似乎解释器正在存储被调用的每个源代码,或者看起来像VS的诊断工具。 Memory heap from snapshot

为什么MoonSharp会在每次调用时存储那么多数据?

1 个答案:

答案 0 :(得分:1)

简单回答:您(可能)正在为您要执行的操作调用错误的API。 DoString在指定的Script上下文中加载指定的代码并运行它。如果您反复传递相同的代码,则只需加载越来越多的副本。

所以有两种选择,取决于你想要达到的目标:

  1. 您正在使用LuaCore.Call来调用每次都不同的脚本:使用Script.RunString(code) - 它是一个静态方法,并且不会保留从一次运行到另一次运行的任何状态
  2. 您正在使用LuaCore.Call一遍又一遍地调用相同的脚本:一次调用DynValue ret = script.LoadString(code),然后反复调用script.Call(ret)
  3. 希望这有帮助。