我创建了一个 Windows 服务来构建和发送电子邮件。我正在使用Razor 引擎来解析电子邮件模板。我正在使用动态 ExpandoObject 来创建模型。
我的问题是当每封电子邮件被创建和发送时,内存在增加,但它从未被释放。我已经使用 Ants Memory profiler 分析了该服务(我以前没有使用过),但它显示了以下结果:
使用剃须刀引擎
使用 Razor.Parse(text,model) 解析 200 封电子邮件
第 1 代:12.9kb
第 2 代:15.88mb
大对象堆:290.9kb
分配给 .NET 的未使用内存:3.375mb
非托管:69.51mb
内存碎片总数:197
没有剃须刀引擎
返回 200 封电子邮件未解析的文本。
第 1 代:13.87kb
第 2 代:3.798mb
大对象堆:95.58kb
分配给 .NET 的未使用内存:4.583mb
非托管:44.58mb
内存碎片总数:7
Razor 最大的第 2 代实例是:
System.Reflection.Emit __FixUpData[] - 2,447,640 个活动字节,3,138 个实例
有谁知道为什么这些对象没有被释放并且第 2 代正在增长?每次我想解析模板时,有没有办法拥有一个新的 RazorEngine 实例,当它完成时,它不会被引用,而是会进入 GC。
每次解析模板时,我都尝试创建模板服务的新实例,但这并没有什么不同
using (ITemplateService templateService = new TemplateService())
{
result = templateService.Parse<ExpandoObject>(text, model);
}