2011-01-20 19 views
0

Microsoft.Practices.Unity framework 1.2を使用しており、メモリ使用量が大幅に増加しています。 Gen 0、1、2のガベージコレクタヒープサイズを見てきましたが、オブジェクトはGen 2に継続的に昇格されて、GCによって主張されずに滞在して年齢が上がります。ユニファイドフレームワークのメモリに関する懸念

この過度のメモリ消費を避けるためにできるチューニングはありますか?

答えて

1

ユニティフレームワークが原因であることをどのように知っていますか?注入されたインスタンスが適切に処理されていない可能性があります。 RedGate Memory Profilerは、収集されていないものを正確に教えてくれるので、お勧めします。メモリリークはPITAであり、私は過去2週間それらを処理してきました。

イベントハンドラは、通常、この種の問題の原因です。すべてのイベントハンドラを手動で削除するようにしてください。

私は、あなたが思っていたようにGCをクリーンアップするほどには優れていないことを発見しました。

+0

あなたは正しいです。それはUnityの問題ではないようです。実際には、この動作が他のすべての.NETアプリケーションに共通することを確認するために、より多くのテストを行うつもりです。 Gen 2のオブジェクトはGCによってほとんど要求されません。お返事をありがとうございます。 – Jazz

+0

エンティティフレームワーク(エンティティ接続がオブジェクトコンテキストを解放していない)でメモリリークが最近検出されました.EF4を使用していますか? – TMN

+0

heh、私はEFの使用をやめました。良い発見! –

0

オブジェクトがGen 2に移行している場合は、それらがまだ生きていることを意味します。あなたのクラスがIDisposableを実装し、それらに含まれているすべての参照に対してDispose()を呼び出すようにしてください。これを自動的に行う1つの方法(C#を使用している場合)は、usingブロック内の参照をラップすることです。参照は自動的にブロックの最後に処理されます。

+0

IDisposableパターンを実装してイベントハンドラをクリーンアップし、ディスポーザブルオブジェクトを参照して非処分を行い、アンマネージドリソースをクリーンアップする必要があります。 usingは、Disposableオブジェクト上で.Dispose()が呼び出されたことを確認するだけで、参照されているオブジェクトをクリーンアップしません。 Dispose()を手動で呼び出さないと、GCはファイナライザを呼び出すことで終了します(使い捨てパターンを使用している場合)ので、オブジェクトはGCされます。 –

+0

あなたの答えをありがとう。私はいくつかのシナリオでDispose()を試してみるつもりです。具体的には、私が保証できる巨大なオブジェクトグラフを先導する必要はありません。これは私がかつて約束していたものに反していますが、「開発者はメモリ管理に対処すべきではありません。最後に私たちはする必要があります。 – Jazz

関連する問題