6

アプリのメモリリークを解決しようとしています。RedGateのANTSMemoryProfiler 5.0をダウンロードして実行しましたが、メモリプロファイラーはリークがWeakReferencesに関係していることを教えてくれます。

私が遭遇している問題は、WeakReferenceについて聞いたことがなく、アプリで明示的に宣言されていないことです。私が行った読みから、破壊しようとしているオブジェクト/リソースがあるが、他のオブジェクトが多すぎるために参照し続けることができない場合に、弱参照が作成されると思います。ファイルがまだ使用されているために削除できないのとほぼ同じ方法だと思います。

だから私の質問は、これらの弱い参照がどこから来ているのかをどのように判断するのですか?ByRefの使用ではないかと疑っていますか?別の同僚がハッシュテーブルを提案しました。

弱参照の検出と除去についての説明と、私の疑いについての説明を取得したいと考えています。

ありがとう。

4

4 に答える 4

3

.NET リソース リーク (メモリ/ハンドル/スレッド/その他) との闘いの中で、何よりも重要な 1 つの原因を発見しました: 残留イベント ハンドラーです。処分したいオブジェクトがあり、そのオブジェクトのイベントに登録されたイベント ハンドラーがまだある場合、そのオブジェクトは実際には消えません。これらのゾンビは増殖し、爆発するまで連鎖しますあなたが管理しているアプリには、すべての意図と目的のためにリソースリークが含まれています。

散弾銃のアプローチを採用し、最も頻繁に使用され、最も重いクラスを調べて、手動と VB.NET の「Handles」キーワードの両方を使用して追加したイベントを探し、Dispose 中にそれぞれに対して RemoveHandler / -= が呼び出されるようにします。また、可能な限り明確に処分します。

ANTS はこれらの問題を追跡するための優れたツールですが、単純なツールではありません (ただし、これらの問題に対して私が見つけたツールの中で最も単純なものです)。バージョン 5 を使用している場合は、これらの新しいフィルターを利用してください。

残念ながら、特効薬はありません。これは、.NET に関する私の最大の不満の 1 つです。これは、通常、問題がひどく広まり、対処するのが難しくなるまで、自分が問題を抱えていることに気付かないためです。

于 2009-07-10T14:43:13.040 に答える
2

WeakReferenceを使用しても、メモリ リークは発生しません。オブジェクトが収集されますが、最終的にアクセスするオプションがあります。

私はメモリプロファイラーを使用していませんが、

.Net アプリケーションでのすべてのメモリ リークは、イベント/デリゲートに関係しています。

イベントをリッスンするメソッドを追加するときは、イベント (キーワード) を含むオブジェクトから、呼び出したいメソッドを持つオブジェクトへの参照を作成します。

メソッドを含むオブジェクトへの他のすべての参照がなくなった場合、それは収集されると思うかもしれませんが、イベントを介した (目に見えない) 参照がまだあります。

于 2009-07-10T14:36:20.727 に答える
1

WeakReferences が System.Diagnostics.TextWriterTraceListener クラスによって作成されていることを発見しました。私はまだメモリリークを解決しておらず、メモリリークがあるかどうか疑問に思っていますが、WeakReferences がどこから来ているかを知って安心しています。

投稿してくれたすべての人に感謝します!

于 2009-07-15T15:58:40.647 に答える
1

このメモリ リークは、.NET フレームワークの既知のバグです。__ENCList は、エディット コンティニュ機能を提供するために使用される内部 .NET クラスです。この問題の唯一の解決策は、リリース モードで再コンパイルすることです。(実稼働環境で詳細な例外レポートを提供するためにデバッグ モードを使用していた場合、これは残念なことです。)

http://support.microsoft.com/?kbid=919481

Moataz コンピューター エンジニア

于 2010-04-27T13:06:10.747 に答える