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

上一篇: RazorEngine Memory Usage

下一篇: What is causing null byte values in request to get filtered out?