2013-02-20 5 views
6

大きなASP.net 4.0 Webサイトを実行しています。それは人気のある.Netコンテンツ管理システムを使用し、何千ものコンテンツアイテム、数百人の同時ユーザーを持っています - 基本的に重いウェブサイトです。RedGateメモリプロファイラを使用してASP.netでメモリリークを理解する

1日のうちに、IIS7ワーカープロセスのメモリ使用量は8〜10GBに増加する可能性があります。サーバーには16GBがインストールされており、現在1日に1回アプリケーションプールをリサイクルするように設定されています。

メモリ使用量を減らすように圧力をかけています。メモリ使用量の大部分は大きなデータ列のキャッシュに起因しますが、キャッシュ間隔は5〜10分に設定されるため、これらの文字列は最終的にメモリから期限切れになるはずです。

しかし、RedGate Memory Profilerを実行した後、私はメモリリークと考えています。私は、インスタンスリストの結果を、「Disposed Objectsによって排他的にメモリに保持されている」オブジェクトでフィルタリングしました。(これはRedGateフォーラムでメモリリークを検出する方法です)。これは私にメモリ内に保持されている文字列の長いリストを与えました。

各文字列に対して、インスタンス保持グラフを使用してメモリ内の文字列を確認します。 System.stringオブジェクトは、System.Web.Caching.CacheDependencyによってある時点でキャッシュされているようです。グラフを一番上に進めば、System.Web.FileMonitorに達するまで、System.Collections.Specialized.ListDictionaryを含む他のさまざまなクラスを通過します。これは、文字列がファイルへのパス(画像/ PDF/etc)であるので、ある意味があります。

CMSがファイルへのパスをキャッシュしているようですが、これらのキャッシュされたオブジェクトは「リーク」しています。時間が経つと、これはRAMを増やして食べる。

申し訳ありませんが、これは長らく残っています...これらのメモリリークを阻止する手段はありますか?または、アプリケーションプールをリサイクルすることなくそれらをクリアするには?どのようなクラス/コードが漏れを修正できるかどうか確認するためにキャッシュを行っているのを見つけることはできますか?

答えて

0

セッション状態の一部としてメモリに残っている非常に一般的な問題のようです。その場合、あなたの唯一のオプションは1.各ユーザーのセッションに多くのものを入れない2.セッションのライフタイムを短くする(デフォルトは20分だと思う)3.定期的にアプリケーションプールをリサイクルする。

1の一部として、データグリッドコントロールにデータを表示する「良い方法」と「悪い方法」があることがわかりました。必要なデータだけをコピーし、誤ってデータグリッド全体への参照を保持していないことを確認したい場合があります。

+0

私たちはすでにアプリケーションプールをリサイクルしていますが、クライアントはこれを解決策ではなく回避策として見ています。彼らは、正当な理由で、アプリケーションがそれほど多くのメモリを使用してはならないと言っています。 –

+0

'System.Web.Caching.CacheDependency'はASP.NETキャッシュをセッションのキャッシュよりもむしろ使用します。このキャッシュは、キャッシュキーがユーザー固有のものである場合を除いて、何らかの形で静的であり、すべてのユーザーに共有されます(これらの種類の問題を引き起こす可能性があります)。プールをリサイクルしたり、セッションタイムアウトを引き下げたりすると、メモリ使用量ではなくWebアプリケーションの存続期間が制限されます。 – JoeBilly