RazorEngine内存使用情况
我创建了一个Windows服务来构建和发送电子邮件。 我正在使用Razor Engine来解析电子邮件模板。 我正在使用动态ExpandoObject来创建模型。
我的问题是每个电子邮件创建和发送时,内存在增加,但从未被释放。 我使用蚂蚁内存分析器(我之前没有使用过)描述过该服务,但它显示了以下结果:
用剃刀引擎
使用Razor.Parse解析200封电子邮件(文本,模型)
第一代:12.9kb
第二代: 15.88mb
大对象堆:290.9kb
分配给.NET的未使用的内存:3.375mb
非托管:69.51mb
内存碎片总数:197
没有剃刀引擎
返回200封未解析文本的电子邮件。
第一代:13.87kb
第二代:3.798mb
大对象堆:95.58kb
分配给.NET的未使用的内存:4.583mb
非托管:44.58mb
内存碎片总数:7
随着剃刀最大的第二代实例是:
System.Reflection.Emit __FixUpData [] - 2,447,640个实时字节,3,138个实例
有没有人有任何想法为什么这些物体没有被释放,第二代正在增长? 有没有办法让我每次想分析一个模板的RazorEngine的一个新的实例,当它完成它不会被引用,并会去GC。
每次我解析一个模板时,我都试着创建一个模板服务的新实例,但这没有什么不同
using (ITemplateService templateService = new TemplateService())
{
result = templateService.Parse<ExpandoObject>(text, model);
}
每次解析模板时,RazorEngine都会编译一个内存中的程序集。
这可能会变得昂贵。
您应该尽可能重新使用您的模板。
老问题,但要激活模板缓存,您必须为Parse方法提供“缓存”参数(它可以/应该是模板的路径):
return RazorViewService.Parse(File.ReadAllText(path), model, null, cache);
当您编译模板时,创建的动态程序集将加载到当前的appdomain中。 没有工具来卸载它们,因此编译更多模板时,内存不断增长。
您可以在RazorEngine 3.x中使用IsolatedTemplateService来解决这个问题。 它所做的是将已编译的模板加载到新的appdomain中。 当该应用程序域被垃圾收集时,加载到该appdomain中的模板程序集也将被收集。 尽管有一些限制 - 例如无法使用动态模型(Expando对象)或匿名模型。 该模型也需要可序列化。
请查看RazorEngine的作者:http://www.fidelitydesign.net/?p=473
链接地址: http://www.djcxy.com/p/11167.html下一篇: What is causing null byte values in request to get filtered out?