[英]Understanding memory leaks in ASP.net using RedGate Memory Profiler
[英]CSharpScript memory leaks in ASP.NET core APi
我有一个ASP核心API。 一条路由可以从数据库中执行几个c#脚本,以在相同的上下文/全局变量上获得一些计算结果。
所以我有这段代码:
public static async Task<FormulaEvalException> TryEvalAsync<T>(this T formulaContext) where T : FormulaContext
{
FormulaEvalException res = null;
ScriptState state = null;
var scriptOptions = ScriptOptions.Default.WithReferences("System", "System.Linq", "System.Globalization", "Microsoft.CSharp").WithImports(new[] { "System", "System.Linq", "System.Math", "System.Globalization", "System.Collections.Generic" });
foreach (var formulaList in formulaContext.AllFormulas.Values)
{
foreach (var formula in formulaList)
{
formulaContext.CurrentFormula = formula;
try
{
if (state == null)
{
state = await CSharpScript.RunAsync(formula.Script, scriptOptions, formulaContext);
}
else
{
state = await state.ContinueWithAsync(formula.Script);
}
var result = state.ReturnValue;
if (result == null)
{
if (res == null)
{
res = new FormulaEvalException(formula.Title + " : No result");
}
continue;
}
formula.Result = result;
}
catch (CompilationErrorException ex)
{
if (res == null)
{
res = new FormulaEvalException(formula.Title + ex.Message);
}
continue;
}
catch
{
continue;
}
}
}
return res;
}
此代码导致我内存泄漏,用户无法重复这些请求。
从以前的搜索中,我得到了一些信息,作为我的FormulaContext类与位于另一个项目中有关。 因此,我将其放在API项目之外的模型项目中。 但是我仍然有这个问题。
我尝试了几种执行脚本的方法(例如,使用CSharpScript.Create或CSharpScript.EvaluateAsync),但是仍然没有释放内存。
我还听说了AppDomain类,可以在使用后在沙箱中执行脚本并释放内存,但在ASP.NET Core中不再使用AppDomain。
谢谢你的帮助 ;)
好的,我找到了解决方法:
finally
{
GC.Collect();
}
内存从1 GB以上降至250 MG。 我知道,一旦加载了类型或程序集,就无法再将其卸载,但是公式很小,因此我想由于CSharpScript的编译过程,我的内存已满。
我现在正在等待卸载程序集的能力,以彻底清理该程序集。 显然是有计划的: https : //github.com/dotnet/coreclr/issues/552
感谢曾先生的帮助。
你们为什么要跳这么多。 DotNet Core不支持程序集/类型的卸载,并且直到3.0才会卸载。
我正在为DotNet Core开发CMS / VFS,这是目前最大的障碍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.