9

メモリ リークのある Web アプリケーションを保守しています。

Red Gate ANTS メモリ プロファイラを使用して調査したところ、メモリ リークはビジネス レイヤのイベント ハンドラが原因であることがわかりました。

アイテムの日付が変更されたときにコレクションを再ソートできるように、追加された各アイテムにイベント ハンドラーを登録するコレクションがあります。このイベント ハンドラが原因のようです。

このアプリケーションのビジネス レイヤーは非常に複雑であるため、コレクションとその項目をメモリ内に保持すると、他のオブジェクトも一緒にドラッグされます。

コレクションに IDisposable を実装し、Dispose メソッドのイベント ハンドラーを削除しました。

p.OnPunchDateChanged -= this.OnPunchDateChanged;

ただし、コレクションへのすべての参照を using または try/catch ブロックでラップできないため、IDisposable を実装しても役に立ちません。このコレクションは、私が制御できないアプリケーションの一部で使用されています。

これらのイベント ハンドラーをクリアして、このメモリ リークを解決するにはどうすればよいですか?

4

2 に答える 2

4

まず、要点を証明するために、イベントの追加と削除を単純なテキスト ファイルに記録してみてください。次に、追加された数と削除された数を確認します。

ビジネスロジックのどこかにバグがあり、すべての状況でイベントを登録解除していないように聞こえます。

于 2009-01-15T20:01:39.097 に答える
1

イベントはコレクションへの参照を保持するため、コレクションの Dispose メソッドはコードから直接呼び出す必要があります。コレクションがガベージ コレクターによって破棄されることはありません。

また、コレクションの Remove メソッドと Clean メソッドの動作を変更して、削除された項目からイベント ハンドラーを切り離す必要があります。

于 2010-03-18T14:55:28.290 に答える