2009-07-24 15 views
6

私のアプリは、ずっと前から150MBのメモリを使っていましたが、今は286MBです。それはゆっくりと立ち上がるので、私は何かを処分するのを忘れていなければなりません。私は4GBを持っているのでこれは私のための多くの問題ではありませんが、私は1GBのラムしか持たない他の人にこれを送りたいと思います。それ以外の場合は、行ごとにコードを調べる方法を教えてください。処分とメモリの問題を見つけるには? C#

答えて

2

.NET Memory Profilerをチェックしてください。 15日間のトライアルがあり、ライセンス料の価値があります。

容易 .NETメモリスナップショットの 収集と比較スナップショットにより、メモリリークを識別は スナップショットが収集された時点での.NETインスタンス割り当て とライブインスタンスに関するデータ を含みます。彼らは 有用な情報をたくさん提供し、 潜在的なメモリを識別することは容易に リーク、特に2つのスナップショット を比較するとき。 HERESに

1

。これらは、慣れるのがやや難しい場合は、無料で、非常に、非常に徹底的であるという利点があります。

ここには、プロセスを説明するblog postがあります。

+2

windbgとSOSも私のお気に入りです。 Rico Marianiの古いブログ記事があります:http://blogs.msdn.com/ricom/archive/2004/12/10/279612.aspx –

+0

これは私がSOSに元々夢中になったポストでした...しかし、私が投稿したものは、ちょっとした方が簡単だと思います。 –

4

JPとReedの両方の回答が拡大しています。

私はちょっと混乱を避けたいと思っていました。メモリが大幅に増加している場合は、Disposeを呼び出すと問題になることはまずありません。 Disposeは、通常、ハンドルなどの管理されていないリソースを解放するために使用されます。これらは多くのメモリを消費するのではなく、リソースとしてより貴重です。

メモリの増加は、一般に、スタックオブジェクトまたは強力なGCハンドルを介して直接的または間接的に根付いている管理対象オブジェクトからアクセス可能な大きなオブジェクトまたはコレクションに関連付けられます。これはあなたの調査に焦点を当てたいと思われる領域です。

+0

はい、これは大きなポイントです。私はメモリプロファイラーを使って "ああ、そのコレクションは永遠に大きくならないはず!" :) –

+2

また、あなたが購読しているイベントをよく見てください。このイベントはサブスクライバへの参照を保持しています。サブスクライブしないと、その参照は削除されません。 – JulianR

0

this link

スティーブンToubは、以下の は、ファイナライザを追加することで彼の記事

  • からいくつかの簡単なハイライトです、これを行うために様々な技術を説明するために偉大な長さに行くをチェックデバッグ目的のために、 クラスが適切に処理されなかったときを見つけ出す方法を紹介することができます。ファイナライザが呼び出されない場合は、配置されている は、それが呼び出さ配置されていますがありませんでしたどのインスタンス を絞り込むのに役立つためにthreadIdsなど、インスタンスに関する追加情報を取得するには

  • と呼ばれていませんでしたwが、彼はあなたの使い捨てのクラスでしょうFinalizationDebggerクラス を作成します自分自身が破棄されたときに、 FinalizationDebuggerクラスのインスタンスのDisposeを呼び出します。処分は あなたのクラスのインスタンスで呼び出されていない場合はファイナライザが実行されるとき、それはあなたが主張や問題を デバッグに役立つ例外をスローする可能性に FinalizationDebggerインスタンス、

  • 移動し、すべての追跡のためのファイナライザを呼び出しますあなたの使い捨てクラスが から継承するベースクラスに、コードをもっときれいにします。このアプローチは、基本クラスを作成してから別の基底から継承している場合には、 が動作する場合と動作しない場合があります。

  • 最後のオプションでは、すべてのインスタンスが、インスタンス が呼び出す静的クラスに含まれます。 FinalizationDebuggerは、Constructor、Dispose、およびFinalizerという3つの静的メソッドを公開する静的クラスになります。考え方は、あなたのクラスの適切な場所(dispose/finalize/constructor)からこれらのメソッドを と呼んでいるということです。これは通常、わずか3行のコードの追加を伴うので、コードに侵入することは最小限で です。これらのメソッドのうち には、DEBUGモードでクラスをコンパイルするときにクラスによってのみ と呼ばれるようなConditionalAttributeが設定されています。

スティーブンスは、彼のアプローチの賛否両論についても説明します。 このソリューションにはさまざまなオプションがあり、それぞれを評価してどちらが最適かを判断する必要があります。 Aは、IMHOを読んでください。

希望します。

+0

投票を得るためには、より良い答えを記入する必要があります。リンクを指しているだけでは十分ではありません。なぜなら、リンクがうまくいけば、これはもう役に立たない答えです。 –

+0

MSDNの記事で説明されている内容の簡単な要約を含めるには、回答を編集するだけで十分です –

0

ANTS Memory Profilerもお試しください。完全に機能する14日間の無料トライアルがあり、UIが本当に好きです。

開示:彼らは今、Herding Codeをスポンサーしています。それが私が試した理由です。しかし、私は本当にそれに感銘を受けました - 私は30時間のアプリケーションをプロファイリングし、そこからたくさんの有用な情報を得ました。 UIは本当に役立ちます - それはあなたのプロセスをガイドし、それはダンパリティーに見えます。ここで

alt text http://www.red-gate.com/products/ants_memory_profiler/images/object_retention_graph.gif

0

undisposedオブジェクトを検索し、リークを修正するのに役立つためにANTS Memory Profilerを使用してトリックのカップルです。

  1. ANTSメモリプロファイラは、フィルタが廃棄()メソッドが含まれているだけ オブジェクトを示すように設定されることを可能にします。これをオンにすると、廃棄されていないライブオブジェクトのリストが与えられた になります。

  2. 未配置のオブジェクトを見つけるのは便利ですが、さらに便利なのは で、これらのオブジェクトが配置されていないことがわかります。これらの の未配置オブジェクトがどこに作成されているのかを見つけることは、漏れの理由を見つけるために長い道のりになります。漏れたオブジェクトのコードを変更できる場合は、 の便利なトリックは、スタックトレースを保持するフィールドを導入することです。 はオブジェクト作成時にこのフィールドに値を設定します。 ANTSメモリプロファイラでは、オブジェクトのフィールドを検査することができるため、漏れたオブジェクトが作成されたときと同じように、スタックトレースを読み取ることができます。これは、漏れているオブジェクトの所有者が誰であるべきか、そして彼らが担当するオブジェクトに対してDisposeを呼び出す方法について強い手がかりを与えます。

関連する問題