我创建了一个windows服务来构建和发送电子邮件。我正在使用剃须刀发动机来解析电子邮件模板。我正在使用一个动态ExpandoObject来创建模型。
我的问题是,当每封电子邮件被创建和发送时,内存正在增加,但它从未被释放。我用Ant内存分析器对该服务进行了描述(我以前没有使用过它),但是它显示了以下结果:
带有Razor Engine的
用Razor.Parse解析200封电子邮件(文本、模型)
第1代: 12.9kb 第二代:15.88mb 大对象堆: 290.9kb 分配给.NET的未使用内存: 3.375mb 非托管: 69.51mb 内存碎片总数: 197
无Razor引擎
返回200封未解析的电子邮件。
第1代: 13.87kb 第二代: 3.798mb 大对象堆: 95.58kb 分配给.NET的未使用内存: 4.583mb 非托管: 44.58mb 内存碎片总数:7
对于Razor,最大的第2代实例是:
System.Reflection.Emit __FixUpData[] -2,447,640个活字节,3,138个实例
有没有人知道为什么对象不被释放,第二代正在增长?是否有一种方法可以在每次解析模板时都有一个新的RazorEngine实例,当它完成时,它将不会被引用,并且会转到GC。
每次解析模板时,我都尝试创建一个新的模板服务实例,但这并没有起到什么作用。
using (ITemplateService templateService = new TemplateService())
{
result = templateService.Parse<ExpandoObject>(text, model);
}发布于 2012-09-06 13:47:05
每次解析模板时,RazorEngine都会编译内存中的程序集.
可能会很贵。
您应该尽可能多地重用您的模板。
发布于 2014-03-26 18:03:32
老问题,但是要激活模板缓存,必须向Parse方法提供" cache“参数(它可以/应该是模板的路径):
return RazorViewService.Parse(File.ReadAllText(path), model, null, cache);发布于 2014-10-08 01:33:00
如果您使用同一个模板,重复调用RazorEngine.Compile一次,那么在那里之后调用Razor.Run,以确保只编译一次模板。
此外,我相信当在构建中启用调试时,RazorEngine似乎会泄漏内存。确保您的产品代码是使用发行配置文件构建的,即没有调试编译器常量。
https://stackoverflow.com/questions/12301515
复制相似问题