2

アンマネージ dll から 1 秒あたり少なくとも千のコールバックを受信し、定期的にソケットからメッセージを送信するマルチスレッド アプリケーションに C# 2.0 を使用しています。GUI はメイン スレッドに残ります。

私のアプリケーションは、ほとんどの場合、起動時にオブジェクトを作成し、実行中に定期的に短期間だけ作成します。

私が経験している問題は、GC の実行時に発生すると思われる定期的なレイテンシ スパイク (開始時と終了時の関数のタイム スタンプによって測定される) です。

私はperfmonを実行しましたが、これが私の観察結果です...

Gen0 ヒープ サイズはフラットで、数秒ごとに定期的なスパイクがあります。

Gen1 ヒープ サイズは常にロール上にあります。上下

Gen2 ヒープ サイズはサイクルに従います。しばらく平らになるまで増加し続け、その後低下します。

第 0 世代および第 1 世代のコレクションは、常に 1 ~ 5 ユニットの範囲で増加しています。Gen 2 コレクションは一定です。

4

3 に答える 3

1

実際にメモリ リークが発生しているかどうかを確認するには、メモリ プロファイラを使用することをお勧めします。多くの利用可能なものがあり、問題をすばやく特定することができます。

ガベージ コレクターは適応型であり、アプリケーションがメモリを使用する方法に応じて実行頻度を変更します。問題の原因を特定するという点では、生成ヒープ サイズを見るだけではほとんどわかりません。それがどのように機能するかを2番目に尋ねるのは悪い考えです。

RedGate Ants メモリ プロファイラー

SciTech .NET メモリ プロファイラー

EQATEC .NET プロファイラ

CLR プロファイラー (無料)

于 2011-11-10T21:36:49.790 に答える
0

@Jalfが言うように、メモリ「リーク」自体の証拠はありません。あなたが議論しているのは、ガベージコレクションによって引き起こされるレイテンシーに近いです。

他の人は同意しないかもしれませんが、毎秒数百回のコールバックを超えると、C# のような汎用言語、特にユーザーに代わってメモリを管理する言語を拡張することをお勧めします。そのため、メモリの割り当てを賢く行い、ランタイムに何らかの助けを与える必要があります。

まず、実際のプロファイラーを入手します。Perfmon には用途がありますが、Visual Studio の新しいバージョンのプロファイラーでも、より多くの情報を得ることができます。私は SciTech プロファイラー (http://memprofiler.com/) が一番気に入っています。ここでレビューされたRedGateからの尊敬されているものを含む他のものがあります:http://devlicio.us/blogs/scott_seely/archive/2009/08/23/review-of-ants-memory-profiler.aspx

ベースラインがわかったら、gen2 コレクションの排除を目指します。彼らは本当に遅いものになります。できるだけ多くのメモリ割り当てを排除するために、タイトなループで懸命に作業してください。文字列は通常の違反者です。

いくつかの役立つヒントは、古くても関連する MSDN の記事http://msdn.microsoft.com/en-us/library/ms973837.aspxにあります。

また、ASP.NET アプリケーションのデバッグに関する Tess Ferrandez の (優れた) ブログ シリーズを読むこともお勧めします。 04/net-debugging-demos-information-and-setup-instructions.aspx .

于 2011-11-10T21:37:45.517 に答える
0

少し前に、.NET (具体的には XBox 360 上の XNA) のメモリ パフォーマンスに関するブログ記事を読んだことを覚えています (残念ながら、そのリンクはもう見つかりません)。

低レイテンシのメモリ パフォーマンスを達成するための簡単な説明は、パフォーマンスが重要な時間に第 2 世代の GC を実行しないようにすることでした (ただし、レイテンシが重要でない場合は実行しても問題ありません。GCクラスには多くの通知コールバック関数があります)。これに役立つフレームワークの最近のバージョン)。これを確実に行うには、次の 2 つの方法があります。

  1. gen 2 にエスケープするものは何も割り当てないでください。気付かないうちに、オブジェクトが gen 2 にエスケープするのは驚くほど簡単です。Gen 2 にエスケープするオブジェクトがないため、GC は収集する必要がありません。
  2. 必要なものはすべて事前に割り当て、オブジェクト プーリングを使用します。Gen 2 ヒープは大きくなりますが、何も追加されていないため、GC はそれを収集する必要はありません。

ゲームやリソースに制約のあるデバイスは多くの場合、遅延に非常に敏感であるため、XNA または Silverlight 関連のパフォーマンスに関する記事を調べると役立つ場合があります。(XBox 360 と、Mango までの Windows Phone には、単一世代の GC (マーク アンド スイープ コレクター) しかなかったので、簡単であることに注意してください)。

于 2011-11-10T23:00:05.427 に答える