【发布时间】:2020-04-23 03:02:29
【问题描述】:
首先,我使用 Windows 10 和 Visual Studio 2019,使用 .net core 3.1 我正在使用来自 Nuget Microsoft.Net.Compilers 3.4.0 和 Microsoft.CodeAnalysis 3.4.0 的 Roslyn
我在我的项目中使用 Roslyn 来动态编译脚本。我注意到我的应用程序的内存使用量非常高(每个脚本需要 20-50MB 的内存)来编译一些非常小的脚本(5-10kb)。
我最初认为内存使用量来自加载程序集,但我隔离了 CSharpCompilation.Create,它似乎占用了 10MB,而 CSharpCompilation.Emit 占用了其余部分 (10-40MB)。
我减少它以重现错误
public byte[] CompileCSharpCode(string assemblyName, string code)
{
SyntaxTree syntaxTree = SyntaxFactory.ParseSyntaxTree(code, null, "");
CSharpCompilation compilation = CSharpCompilation.Create
(
assemblyName,
new[] { syntaxTree },
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
references: _referencesList
);
//at this point the memory usage goes up by 10MB
using (var stream = new MemoryStream())
{
var emitResult = compilation.Emit(stream);
//at this point the memory usage goes up by 10-40MB
return stream.ToArray();
}
}
我希望在调用函数、创建对象和进行编译时内存会增加,但内存永远不会释放。编译200个脚本后,内存占用数GB。
即使我删除了用于编译的每个对象,包括保存结果的字节数组,内存仍然很高。
目前,我求助于创建第二个 .net 核心应用程序,我调用该应用程序以逐个预编译我写入 .dll 文件的每个脚本并将它们加载到内存中(对于 200 个脚本,总共需要大约 20MB 的内存)
有没有办法用 Roslyn 编译我的脚本而不会出现这个巨大的内存问题?
【问题讨论】:
-
我相信这是您遇到的问题:github.com/dotnet/roslyn/issues/22219 如果不是,请在github.com/dotnet/roslyn/issues/new 上提出新问题
-
@JonathonMarolf 这个问题是关于 CSharpScript 而不是 CSharpCompilation,它们用于不同的用途。所以我会按照你的建议提交一个新问题。
标签: c# memory-leaks roslyn