0

Prism 4を使用してWPFアプリケーションを開発しており、リソースが解放されていないために深刻なメモリリークが発生しています。ANTSメモリプロファイラーを使用して、ガベージコレクターによるメモリの解放を妨げているクラスを検出していますが、このツールは非常に新しいため、その出力についての理解は限られています。

テストケースは、リストからプラグインを選択できるウィンドウを開くことで構成されています。このウィンドウは、ヘッダー、一連のボタン、およびアクティブなWizardPage(つまり、UserControl)を表示するメイン領域を含むWizardコントロールをホストします。プラグインを選択して[次へ]ボタンをクリックすると、さらに多くのWizardPageコントロールがWizard Regionに登録され、RegionAdapterを使用してWizard.Pagesコレクションに追加されます。その後、ユーザーは[次へ] /[前へ]ボタンをクリックしてページ間を移動できます。ウィザードウィンドウを開いて[キャンセル]ボタンをクリックすると、ウィザードコントロールのファイナライザーが期待どおりに呼び出されます。ただし、[キャンセル]ボタンをクリックする前にウィザードウィンドウを開いてプラグインのComboBoxを展開すると、ウィザードコントロールのファイナライザーが呼び出されることはありません。これは、ANTSメモリプロファイラーのウィザード用インスタンスカテゴリのスクリーンショットです。

インスタンスカテゴリ

私たちはほとんどすべてを試しましたが成功しませんでしたが、誰かがここで何が起こっているのかを理解するのを手伝ってくれるでしょうか?

前もって感謝します。

4

1 に答える 1

2

ANTS Memory Profilerを使い始めたばかりの場合は、インスタンス カテゴライザーではなく、クラス リストを確認することから始めるのが最も便利な場合があります。

アプリケーションで [次へ] ボタンをクリックする前に、ベースライン スナップショットを取得することから始めるのがおそらく適切な方法です。次に、ウィザード ウィンドウを開き、プラグイン コンボボックスを展開して、[キャンセル] をクリックします。その時点で、ANTS で別のメモリ スナップショットを取得し、2 つを比較します。class listに移動すると、以前は存在せず削除されたはずの WizardPage クラスのインスタンスが現在メモリ内に存在する可能性があります。それを選択してから、ANTS でインスタンス リストに移動します。

WizardPage のインスタンスを選択し、クリックしてインスタンス保持グラフを表示します。これは、その特定のインスタンスをメモリに保持している GC ルートに戻る参照のチェーンを示しています。

これらの参照チェーンを振り返ることで、オブジェクトをメモリから解放するために切断する必要があるリンクが存在することを特定できるはずです。

于 2013-01-16T17:53:17.460 に答える