電子メールを作成して送信するためのWindowsサービスを作成しました。私はRazor Engineを使って電子メールのテンプレートを解析しています。私は動的なExpandoObjectを使用してモデルを作成しています。RazorEngineメモリ使用量
私の問題は、各電子メールが作成され、送信されたメモリが増加しているが、決してリリースされていないことです。私はアリメモリープロファイラでサービスをプロファイリングしている(私は前にこれを使用していない)が、それは次のような結果を示している。
レイザーエンジンで
Razor.Parse(テキスト、モデルで200通の電子メールの解析します)
ジェネレーション1:12.9キロバイト
ジェネレーション2:15.88メガバイト
ラージオブジェクトヒープ:.NETに割り当てられた290.9キロバイト
未使用メモリ:3.375メガバイト
非管理:69.51メガバイト
メモリの断片の総数:197
んレイザーエンジン
200個の電子メールを解析していないテキストを返す。
ジェネレーション1:13.87キロバイト
ジェネレーション2:3.798メガバイト
ラージオブジェクトヒープ:95.58キロバイト
未使用のメモリ.NETに割り当てられた:4.583メガバイト
アンマネージ:44.58 mb
合計メモリフラグメント数:7
かみそりで
最大の世代の2つのインスタンスは以下のとおりです。
System.Reflection.Emit __FixUpData [] - 2447640ライブバイト、3,138インスタンス
は、オブジェクトが解放されていない理由を任意のアイデアを誰を持っており、第2世代は成長していますか?テンプレートを解析するたびにRazorEngineの新しいインスタンスを作成する方法はありますか?終了すると、テンプレートは参照されず、GCに移動します。
アイブ氏は、テンプレートのサービスの新しいインスタンス私はテンプレートを解析するたびに作成しようとしたが、これhasntが違い
using (ITemplateService templateService = new TemplateService())
{
result = templateService.Parse<ExpandoObject>(text, model);
}
これは古い質問ですが、 'Parse()'を呼び出すとテンプレートがキャッシュされるとは思いません。私がやったことは 'Razor.GetTemplate()'を使い、返された 'ITemplate'インスタンスに対して' Run() 'を呼び出すことでした。アセンブリがどのくらいのメモリを使用しているかを確認するには、適切にキャッシュされている場合は、テンプレートごとに1つのアセンブリのみが必要です。 – mao47
テンプレートを正常にキャッシュしましたか?私のサービスのメモリはまだ増加し、ガベージコレクションは一度も行われません。メモリ使用量が減少したことに気付きましたか? – ministrymason
現在、ITテンプレートを作成しています。template = Razor.Resolve(templateFileName、model); string result = template.Run();しかし、記憶はまだ馬鹿げて成長する。 – ministrymason