私はかなり大量のデータで動作する標準のCRUDアプリケーションを持っています。異なるウィンドウはLinq-To-SQLを使って異なるテーブルにアクセスし、各ウィンドウは本質的に私が表示しているオブジェクトにバインドされたセルを持つグリッドを持っています。ここでウィンドウがガベージコレクションされないのはなぜですか?
が起こっているのはかなり標準的な使用のケースです:
- オープンウィンドウA
- ウィンドウを閉じるA - ウインドウAがメモリにまだ今ではありませんが、見えなく。
- ウィンドウを開くB
- ウィンドウを閉じるウィンドウB - ウィンドウAとBは両方ともメモリにあり、どちらも表示されません。
- オープンウィンドウC
- ウィンドウCのデータが取得されると、ウィンドウAのリソースが解放されます。
いつでも私は実際に持っているべきであるときに私は2-3の窓を記憶に持っています。私はnullに考えることができるすべての参照を設定するこれらのウィンドウの終了イベントに廃棄コードを追加しました。
私はANTSメモリプロファイラを使ってみましたが、各ウィンドウがGCルートとして設定されていることに気付いています。この動作を無効にする方法がありますか、または何らかの理由でGCがこれらのウィンドウから収集するように強制しますか?
ありがとうございます!
PS:this linkを確認しても問題は解決しませんでした。
編集:問題は、ユーザーがSystem.OutOfMemoryExceptionsを取得していることです。
"一般的にGCには自分の人生があります。" - 私がGC.Collect()を呼び出すときでさえ、リソースを解放しません。何かがこれらのリソースを保持しているかのようですが、これを行う可能性はわかりません。これらのオブジェクトは収集する必要があります - 私はプロファイラーでこれを検証しました。問題は、各ウィンドウがGCルートであることと関係があると仮定していますが、 WPF。 – Jake
元の投稿から、リソースは解放されたようですが、GC.Collect()を呼び出した直後ではないようです。 – Zepplock
GC.Collect()はリソースを解放していないようです。私がこのメソッドを呼んでいないときに解放されるのと同じ時期に、ずっと遅くなってしまいます。 – Jake