0

私はこのトピックについて多くのことを読んできましたが、まだどのように進めればよいか明確な道筋がありません。一部のオブジェクトdctorが呼び出されない理由を見つける方法の詳細な手順を示すリソース(または説明)を誰でも指摘できますか。

基本的にリークをテストするための私のロジックはこれです(WPFアプリケーション):

  1. View/ViewModel を作成する
  2. ビューを閉じる
  3. GC.Collect() を呼び出す

数秒後、ViewModel クラスの dctor が通常呼び出されますが、私のアプリケーションでは呼び出されません。私の意見では、メモリリークの原因を見つける方法であるため、その時点でどのオブジェクトが参照を保持しているかを知りたいです。

このクラスはアンマネージ リソースを使用せず、IDisposable実装もしていません。つまり、デストラクターの実行を防ぐための SupressFinalize 呼び出しはありません。

編集: ViewModel は、ViewModelLocator の Static プロパティを介して取得され、List に追加されます。これは、バインド先のビュー モデルのコレクションを必要とする TabControl で必要です。View と ViewModel は DataTemplate を介して接続されます。

4

1 に答える 1

0

まず、サブスクライブされていないイベント ハンドラーと、ViewModel を間接的に指す静的参照を検索します。DependencyPropertyDescriptor.AddValueChangedWPF アプリケーションを使用しているため、静的参照を使用してリークを引き起こすことが知られているものを使用しないようにしてください。

手動で何も見つからない場合は、素晴らしい (これは私の意見であり、私は決してそれらと提携していません) SciTech .NET Memory Profilerを使用してください。すべてのオブジェクトについて、それが保持しているすべての参照と、そのオブジェクトへの参照を保持している他のオブジェクトを、素敵なグラフ ビューで確認できます。また、一般的なメモリの問題についても警告します。

編集:

ViewModel は、ViewModelLocator の Static プロパティを介して取得されます

もう検索しないでください。リークがあります。静的参照は、オブジェクトがガベージ コレクションされるのを防ぎます。静的参照を削除するか、WeakReference.

于 2012-08-23T13:53:36.707 に答える