2011-02-01 7 views
1

SL4、PRISM、MVVMを使用してLOBアプリケーションを構築しています。私は非常に最近私のアプリはメモリを解放していないことに気づいた。私はb/wページを切り替えると、約150MBから始まり、1GB +まで非常に高速になります。私たちのデザインには、それぞれイベントを待ち受けて適切な領域にビューを注入するControllerクラス(Unityシングルトン)を持つ3つのモジュールが含まれています。これは、イベントを発生させてビューを挿入するときに、これらのコントローラで起こっていることです。シルバープリズム/ユニティのメモリリーク

var v = Container.resolve<view>() 
var vm = Container.resolve<viewmodel>() 
v.datacontext = vm; 
myregion.addtoregion(v); 

このように、このビューを100回呼び出すと、これを100回終了します。 addviewregionメソッドでは、新しいビューを追加する前に、既存のビューをすべて削除します。そして、メモリの問題を見た後、私は削除する必要のあるすべてのビューに対して、addviewtoregionメソッドでビュー& viewmodelをnullに設定しました。メモリ消費量は同じです。 Unity ContainerControllled ...これらのオブジェクトへの参照を保持するオブジェクト(マイコントローラ)ですか?

答えて

1

これらのダイナミックビューでイベントを処理するように登録していて、ビューを削除する前に登録を忘れていますか?イベントを処理すると、オブジェクトへの暗黙的な参照が作成されます。これは通常、管理されたメモリリークが発生する場所です。

this guideを調べて、漏れやすいSilverlightコントロールを追跡し、WinDbgを使用してヒープとGCのルーツを調べる必要があります。

+0

これは考えられる原因です。イベントアグリゲータイベントの弱いイベント処理を使用する必要があります。 –

+0

解決されたオブジェクトがガベージコレクションされていないか、コンテナ設定に問題があるようです。私は次のコードでテストしました: – user396491

+0

WeakReference ref1 = new WeakReference(Container.Resolve

()); WeakReference ref2 = new WeakReference(新しいフッター()); GC.Collect(); GC.WaitForPendingFinalizers(); bool isRef1Alive = ref1.IsAlive; bool isRef2Alive = ref2.IsAlive; フッターはUserControlで、最初はTrueを返しますが、2番目のFalseはFalseを返します。コンテナは解決したアイテムへの参照を保持していますか?ところで、私はこのビューのためのインターフェイスを持っていない。私は Container.RegisterType ()を追加しました。ブートストラップ(ConfigureContainerメソッド)内の それでも同じ結果。 – user396491