メモリ プロファイラを使用して、アプリケーションをトレースしています。そのアプリケーションで、フォームを複数回連続して開くと (6)、アプリケーションが不安定になり、終了する場合があります。
メモリリークが疑われました。したがって、次のルートパスをたどります
メモリ リークを修正するために、このグラフをどのように読み取るか?
メモリ プロファイラを使用して、アプリケーションをトレースしています。そのアプリケーションで、フォームを複数回連続して開くと (6)、アプリケーションが不安定になり、終了する場合があります。
メモリリークが疑われました。したがって、次のルートパスをたどります
メモリ リークを修正するために、このグラフをどのように読み取るか?
ルートが上にあり、コントロール/クラスが下にあります。通常、パス内の問題を見つけようとして、どちらの方向にも読みます。前述のように、EventHandlerは非常に一般的な問題です。特に静的なコンテキストで。つまり、一部のクラスは+ =でイベントにフックし、再びフックを解除することはありません。クラスとそれを提供するイベントの両方のコンポーネントが非静的であり、他の場所に保持されていない限り、これは問題ありません。
あなたの例では、UserPreferenceChangedイベントが問題のようであり、静的イベントだと思います。したがって、UltraToolbarsManager(これも静的であるように見えます)は、そのイベントをフックします。UltraToolbarsManagerは、ツールバーアイコンのすべてのクリックイベントも処理するようです。したがって、問題は、クラスがToolClickイベントに接続することです。
考えられる解決策は
スタックの一番上にたくさんのeventHandlerがあります。
メモリリークの一般的な原因は、インスタンスがEventHandlerによって直接ルート化されていることです。「リークされた」インスタンスは、EventHandlerのターゲットとしてのみ使用される可能性があり、それに到達する他の方法はありません。それらはすでに処分されているかもしれません。
.NET MemoryProfilerの(証跡)を使用することをお勧めします。スナップショットをキャプチャし、eventHandlersがインスタンスを存続させるなどの一般的な問題を自動的に指摘できます。