【问题标题】:DynamicExpresso Eval memory leakDynamicExpresso Eval 内存泄漏
【发布时间】:2017-08-17 08:15:28
【问题描述】:

在这样的简单表达式求值中是否有避免内存泄漏的解决方案?

        inter.SetVariable("tick", tick++);
        if (inter.Eval<bool>("(tick%2)==1"))
        {
            odd++;
            if ((odd % 100) == 0)
                System.GC.Collect();
        }
        else
            even++;

我在带有 Mono (5.0.1.1) 的 Linux 机器上的 WinForm 应用程序中定期运行此代码,并且内存使用量不断增加。 在 Windows 上测试,Process.WorkingSet64 的增长速度低于 Linux。 GC.GetTotalMemory 总是稳定的。

【问题讨论】:

    标签: dynamic-expresso


    【解决方案1】:

    如果可能,最好使用Parse 方法,然后多次使用Invoke 表达式。

    类似:

    // One time only
    string expression = "(tick%2)==1";
    Lambda parsedExpression = interpreter.Parse(expression, new Parameter("tick", typeof(int)));
    
    // Call invoke for each cycle...
    var result = parsedExpression.Invoke(tick++);
    

    但是从我之前的测试来看,我没有看到任何内存泄漏,你确定这是问题所在吗?

    【讨论】:

    • 我用我发布的代码再次进行了测试,经过 30K 循环后我丢失了 17MB。根据您的建议更改代码后,我没有相同周期数的内存泄漏。我现在的问题是我有一组变量和一组表达式,我不知道表达式中使用了哪个变量。 SetVariable/Eval 二人组完美解决了这个问题:您对在这种情况下如何使用 Invoke 有什么建议吗?
    • @EzioR。变量集是固定的还是动态的?在第一种情况下,您可以使用您拥有的所有参数创建表达式。在第二种情况下,也许你可以添加一个字典类型的参数来填充?所以你可以这样写:vars["a"]vars 你的字典在哪里?
    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    • 2013-06-24
    相关资源
    最近更新 更多