0

メモリ プロファイラを使用して、アプリケーションをトレースしています。そのアプリケーションで、フォームを複数回連続して開くと (6)、アプリケーションが不安定になり、終了する場合があります。

メモリリークが疑われました。したがって、次のルートパスをたどります ここに画像の説明を入力

メモリ リークを修正するために、このグラフをどのように読み取るか?

4

2 に答える 2

1

ルートが上にあり、コントロール/クラスが下にあります。通常、パス内の問題を見つけようとして、どちらの方向にも読みます。前述のように、EventHandlerは非常に一般的な問題です。特に静的なコンテキストで。つまり、一部のクラスは+ =でイベントにフックし、再びフックを解除することはありません。クラスとそれを提供するイベントの両方のコンポーネントが非静的であり、他の場所に保持されていない限り、これは問題ありません。

あなたの例では、UserPreferenceChangedイベントが問題のようであり、静的イベントだと思います。したがって、UltraToolbarsManager(これも静的であるように見えます)は、そのイベントをフックします。UltraToolbarsManagerは、ツールバーアイコンのすべてのクリックイベントも処理するようです。したがって、問題は、クラスがToolClickイベントに接続することです。

考えられる解決策は

  1. UltraToolbarsManager(静的でない場合)を破棄/クリーンアップして、UserPreferenceChangedイベントがフック解除されるようにするか、
  2. 自分のクラスをクリーンアップするときに、ToolClickイベントからフックを外します。
于 2013-02-08T12:03:59.753 に答える
1

スタックの一番上にたくさんのeventHandlerがあります。

メモリリークの一般的な原因は、インスタンスがEventHandlerによって直接ルート化されていることです。「リークされた」インスタンスは、EventHandlerのターゲットとしてのみ使用される可能性があり、それに到達する他の方法はありません。それらはすでに処分されているかもしれません。

.NET MemoryProfilerの(証跡)を使用することをお勧めします。スナップショットをキャプチャし、eventHandlersがインスタンスを存続させるなどの一般的な問題を自動的に指摘できます。

于 2013-02-08T11:30:16.117 に答える