2009-11-26 6 views
13

ActiveXコントロールを使用するWindowsフォームアプリケーションがあり、.NETパフォーマンスオブジェクトの「.NET CLRメモリ」に私たちのアプリケーションがアイドル状態で座っていても、使用中の「同期ブロック」の数は(メモリ使用量の増加に伴って)絶えず増加しています。「同期ブロック」とはカウントを減らすためのヒント

シンクブロックカウント状態のビルトイン説明:

このカウンタは、使用中のシンクブロックの現在の数を表示します。同期ブロックは、同期情報を格納するために割り当てられたオブジェクトごとのデータ構造です。同期ブロックは、管理オブジェクトへの弱い参照を保持し、ガベージコレクタによってスキャンする必要があります。同期ブロックは、同期情報の格納に限定されず、COM相互運用メタデータを格納することもできます。このカウンタは、同期プリミティブを頻繁に使用することによるパフォーマンスの問題を示すために設計されています。

別のアプリケーションに切り替えると、同期ブロック数がリセットされるようです。正確にこれらが作成される原因となり、これらの数を減らすためのヒントはありますか?

(ところで、本当に、そのタイプミスや配管冗談ならば、私はよく分からない。パフォーマンスカウンタのリストに「シンクブロックを」綴られる)あなたは、このようなlockなどのプリミティブロックを使用

+0

これらのブロックをシンクブロックといいます。 –

答えて

19

毎回か.NETプラットフォームのMonitor.Enterでは、ロック対象のオブジェクトインスタンスに対してシンクブロック構造が初期化されます。定義に記載されているように、これらのブロックには、オブジェクトのハッシュコードやCOM相互情報などの情報を保持することができます。

これらのブロックには制限があるため、ブロックに同時にアクセスすると競合が発生し、オブジェクトヘッダーの内容がCLRで管理されるシステム全体の同期ブロックのインデックスになります。 CLRは、オブジェクトがそれらを必要とするときに、これらの同期ブロックをリサイクルすることができます。

オブジェクトをロックすると、システムのカーネルオブジェクトを待機する前に、常にCPUが回転します。割り当てられたCPUスピンが満足されずに、モニタがクリティカルセクションロックを取得できるようになると、システムの自動リセットイベントハンドルが作成され、関連するシンクブロックに参照が挿入されます。このイベント・ハンドルで待機している他のスレッドは、所有しているスレッドがイベント・ハンドルのリリースをトリガーするまで、イベント・ハンドルをブロックします。

したがって、このカウンタが絶えず増加すると、1つまたは複数のオブジェクトのロックに対して多すぎるスレッドが競合し、これらのロックが解放されないことがあるという兆候です。

+0

GetHashCode()を呼び出すとsyncブロックも初期化されることにも言及してください。 –

+0

@VincePanuccio私はそれが.NET 1.1のものだと思いますか? (つまり、CLRは今日それをしていますか?) – user2864740