C#のスレッドごとのメモリ管理
-
04-10-2019 - |
質問
議論を続けます VS2010 C#並列プロファイリング結果の理解 しかし、もっと重要なこと:
私は、小さなクラスに多くのメモリ割り当てを使用する並行して(並列/各/それぞれを使用)に動作する多くのスレッドを持っています。
これにより、グローバルメモリアロケータースレッドに関する競合が作成されます。
.NETに各スレッドのメモリプールを事前に表示し、このプールからすべての割り当てを行うように指示する方法はありますか?
現在、私のソリューションは、メモリプール(スレッド間でリサイクルされるタイプTのオブジェクトのグローバルに割り当てられたアレイ)の私自身の実装ですが、これは大いに役立ちますが、効率的ではありません。
- 特定のメモリスライスから割り当てるように.NETに指示することはできません。
- 私はまだ電話する必要があります 新着 プールのメモリを割り当てるために何度も。
ありがとう、
ハガイ
解決
私はあなたが抱えていたのと同じ問題に対する答えを見つけようとして2日間検索しました。答えは、Garbage Collectionモードをサーバーモードに設定する必要があることです。デフォルトでは、ワークステーションモードに設定されたガーベージコレクションモード。ガベージコレクションをサーバーモードに設定すると、管理されたヒープが個別に管理されたセクション、1パーセントのCPUに分割されます。これを行うには、app.configファイルに設定設定を追加する必要があります。
<runtime>
<gcServer enabled="true"/>
</runtime>
私の12コアOpteron 6172の速度の違いは劇的でした!
他のヒント
ゴミコレクターはメモリを割り当てません。
多くの小さな一時的なオブジェクトといくつかの長寿命のオブジェクトを割り当てているように聞こえます。ゴミコレクターは、一時的なオブジェクトのゴミを収集するのに多くの時間を費やしているので、アプリはより多くのメモリを要求する必要がないようにしています。 OS。から .NETフレームワーク4高度な開発 - ゴミコレクション:
マネージドヒープでアドレススペースが利用できる限り、ランタイムは新しいオブジェクトにスペースを割り当て続けます。ただし、メモリは無限ではありません。最終的に、ゴミコレクターは、記憶を解放するためにコレクションを実行する必要があります。
ソリューション: たくさんの小さな一時的なオブジェクトを割り当てないでください。 オンページ ごみ収集とパフォーマンス また、役立つかもしれません。
オブジェクトの束を事前に割り当てて、個別のスレッド用のグループにそれらを保持することができます。ただし、これからより良いパフォーマンスを得ることができない可能性があります。
ゴミコレクターは、小さな短命のオブジェクトを効率的に処理するように特別に設計されています。オブジェクトをプールに保持する場合、それらは長寿命であり、ゴミコレクションに耐えます。これは、第2世代のヒープにコピーされることを意味します。このコピーは、新しいオブジェクトを割り当てるよりも高価になります。