2

レガシー アプリケーションでメモリ リークが発生しているため、コードがよくわかりません。MemProfiler で分析したところ、オブジェクトから参照されるオブジェクトが増えていることがわかりましたTimerCall。これらはオブジェクトTimerCallbackによって参照され、ルートの子です。_TimerCallbackグラフはRoot-> _TimerCallback-> TimerCallback->のようになりMyObjectます。

MyObjectコンストラクターには a が必要なので、次のTimerCallbackような呼び出しがいくつかあります。

new MyObject(int timeout, new TimerCallback(SomeCallbackMethod));

正直なところ、このようにするのはかなり厄介に見えますが、私が書いたように、これはレガシー アプリケーションであり、「C スタイル」の C# で記述されており、null の代入とDispose()呼び出しがたくさんあります...

TimerCallbackでは、これらの参照をルートから削除するにはどうすればよいでしょうか?

4

1 に答える 1

1

これは、オブジェクトTimerCallbackで使用されているように見えます。Timer多くのタイマーがアクティブになっている理由を調べてください。それらは、コールバックを存続させる本当のルーツである可能性があります。

リフレクター_TimerCallbackでクラスを見回していたところ、何が起こっているのか完全には理解できていませんが、このクラスは赤いニシンだと思います。根本的な原因はタイマー(おそらく無効になっているもの)だと思います。

于 2012-06-14T10:39:30.347 に答える