大規模な ASP.net 4.0 Web サイトを運営しています。一般的な .Net コンテンツ管理システムを使用し、何千ものコンテンツ アイテムと何百もの同時ユーザーを持ち、基本的に重い Web サイトです。
IIS7 ワーカー プロセスのメモリ使用量は、1 日で 8 ~ 10 GB に達する可能性があります。サーバーには 16GB がインストールされており、現在、アプリ プールを 1 日 1 回リサイクルするように設定されています。
メモリ使用量を減らすよう圧力をかけられています。メモリ使用量の多くは、大量のデータ文字列のキャッシュによるものですが、キャッシュ間隔は 5 ~ 10 分に設定されているため、これらの文字列は最終的にメモリから期限切れになるはずです。
ただし、RedGate Memory Profiler を実行した後、メモリ リークと思われるものを確認できます。「破棄されたオブジェクトによってのみメモリに保持される」オブジェクトでインスタンス リストの結果をフィルタリングしました (これがメモリ リークを見つける方法であると RedGate フォーラムで読みました)。これにより、メモリに保持されている文字列の長いリストが得られました。
各文字列について、Instance Retention Graph を使用して、何がメモリに保持されているかを確認します。System.string オブジェクトは、System.Web.Caching.CacheDependency によってある時点でキャッシュされたようです。グラフをずっと上にたどると、System.Collections.Specialized.ListDictionary を含むさまざまな他のクラスを通過し、System.Web.FileMonitor に到達します。文字列はファイルへのパス(画像/ PDFなど)であるため、これはある程度理にかなっています。
CMS がファイルへのパスをキャッシュしているように見えますが、これらのキャッシュされたオブジェクトは「リーク」されています。時間の経過とともに、これが蓄積され、RAM を使い果たします。
申し訳ありませんが、これは長く続きました...これらのメモリリークを止める方法はありますか? または、アプリ プールのリサイクルに頼らずにそれらをクリアするには? リークを修正できるかどうかを確認するために、キャッシュを実行しているクラス/コードを見つけることはできますか?