0

メモリ リークがある MVP プロジェクトがあります (これは Web プロジェクトではありません)。データベースからフォームのグリッドにデータをロードするたびに、メモリが増加します。そのフォームに接続されている各オブジェクトを、ANTS と .NET メモリ プロファイラーで調査してみました。

フォームを開閉するときにフォームに接続されているオブジェクトは、インスタンス保持グラフでは次のようになります。

A -> B : -> にマークされた object1。(参照) B -> A : -> にマークされた object2。(参照先) A、B はクラス

それは正しいアプローチの次の方向ですか?1. 実装されていない各 .cs モジュールでmsdn.comIDisposableのpattern1 を基本クラスに実装します。

  1. 派生クラスでは、msdn から pattern2 を実装するクラス (Disposeメソッドをオーバーライドするもの)
  2. Disposeメソッドの「管理対象リソース」セクションに、オブジェクト/その他の参照 (object.property、object.other_field) をクリアする関数を配置します。

  3. オブジェクトがその.csで使用されなくなったときに、オブジェクトをnullまたはobject.Dispose()に強制します(.csごとにこれを行いますか?または別の方法があります)

これらすべてのメソッドと GC を強制的に実行するにはどうすればよいでしょうか。フォームを閉じるときに明示的に言ってみましょう。

特定の .cs からオブジェクトを削除すれば十分ですか?

ありがとう

4

2 に答える 2

0

あなたの A 参照 B、B 参照 A ステートメントから判断すると、ガベージ コレクションによる参照のクリーンアップを妨げている循環オブジェクト参照があると思います。

ガベージ コレクションは時々実行され、参照されなくなったオブジェクトによって使用されているメモリをクリーンアップします。2 つのオブジェクトが相互に参照している場合、それらはクリーンアップされません。

値を null に変更するだけで参照を削除できます。

この種のことが発生する別の方法は、特に winforms アプリでイベント ハンドラーを使用することです。そのため、追加したイベント ハンドラーは、処理が終わったらフックを外してください。

IDisposable インターフェイスを実装すると、すべてのクリーンアップ コードを配置できる便利なメソッドが提供され、クリーンアップが必要であることをクラスのユーザーに通知できます。dispose メソッドが直接または using ステートメントを介して呼び出されることを確認するのは、まだあなた次第です。

また、ガベージ コレクションを妨げないゆるい方法でオブジェクトへの参照を保持したい場合は、WeakReferenceを使用できますが、ほとんどの場合、これは必要ありません。

于 2013-04-29T02:43:50.987 に答える