2010-11-19 15 views
3

windsorコンテナとエンティティフレームワークを連携させるのに問題がありますが、これは自分自身で導入した問題が原因である可能性がありますが、ひどいメモリリークが発生しているということです。ASP.NET MVCアプリケーションでEntity FrameworkとWindsorを使用するとメモリリークが発生する

私のアプリケーションはEDMXとリポジトリとサービスでセットアップされており、それらとオブジェクトコンテキストは私が使用するwindsor設定ファイルでperwebrequestに設定されています。しかし、私がANTSメモリプロファイラのメモリ使用量を見ると、Disposeが呼び出されたことを確認したにもかかわらず、オブジェクトコンテキストキャッシュがキャッシュとの参照として保持されていることがわかります。

さらに、より多くの動的プロキシがメモリにスタックしています。他の誰かがこのようなピクルスに身を投じることができ、それを出す助けを私に提供できるなら、それは非常に高く評価されるだろう。

+7

コードを表示します。コンテキストライフタイムをどのように管理するのですか? – jfar

答えて

4

:ウィンザーコンテナがそれperwebrequestコンポーネントのDisposeメソッドを呼び出しますが、それはそう

_container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy(); 

それらの参照でガベージコレクションが行われないようにしています。

この場合、参照を保持していたオブジェクトはObjectContext型です。残念ながら、このオブジェクトを破棄したにもかかわらず、このオブジェクトにキャッシュされたすべての動的プロキシは、データベース(または少なくともアクセスしていた部分)のコピーがメモリに追加され、

2

オブジェクトを正しく処理していない可能性があります。 「使用する」ブロックを使用してみてください。

コードを見ずにもっと言うことはできません。

私はウィンザーコンテナのカーネルのリリース設定を変更することにより追跡し、問題を解決するために管理してきました
1

私は同じ問題を抱えていました。

調査の後、私が私のコントローラの工場で_container.Releaseへの呼び出し(コントローラ)を行方不明になったようだった。

public override void ReleaseController(IController controller) 
    { 
     _container.Release(controller); 

     var disposable = controller as IDisposable; 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
     } 
    } 

しかし、私はまた、ウィンザー2.1を使用して_container.Release(コントローラ)を追加していませんでした私のために何もしないでください。

v3.1にアップデートするとうまくいくようです。

これが役に立ちます。

p.s. ANTSメモリプロファイラ - ライフセーバー!

関連する問題