質問

私が読んでいたのは、 ブログの記事 Josh Smith によると、彼は「マネージド ヒープの断片化を減らす」ためにキャッシュ メカニズムを使用しました。彼のキャッシュにより、実行速度がわずかに遅くなりますが、作成される存続期間の短いオブジェクトの数が減ります。

C# のようなマネージ言語におけるマネージド ヒープの断片化はどの程度の問題ですか?問題があるかどうかをどのように診断できますか?通常、どのような状況でそれに対処する必要がありますか?

役に立ちましたか?

解決

すぎない。では一般的に非常に安くて短寿命のオブジェクト。のためのキャッシュで利益を得ることができあうとして使用することができる非常に多くのcandiadatesう生きるべきなので。

どのようにすることができますの診断がですか?

とプロファイラ.ませんので必ず著者のかったです。

どのくらいの問題はヒープの破砕と管理の言語のようにC#?

私が知る限りでは希少であること。.当期純には、成形ゴミの収集家のコレクションを防止するものの断片化.ある問題の大ヒープオブジェクトとがあります。


編集:

できますコメントを下記のディレクティブの人に測定でのキャッシュすることができより遅くな新しいeventargsます。

結論: 測定開始前に最適化.これは良いアイデア/例です。

他のヒント

1 秒あたり 10,000 個以上の存続期間の短い小さなオブジェクトを処理する場合を除き、適切な量の RAM を備えた最新のコンピューターではまったく問題になりません。

したがって、まず、すべての適切なシナリオでコードを実行する必要があります。十分に高速であれば、心配する必要はありません。

速度に満足できない場合、コードが時々「チョーク」する場合、または単に興味がある場合は、さまざまな .NET メモリ統計を監視できます (http://msdn.microsoft.com/en-us/library/x2tyfybc.aspx) パフォーマンス モニター アプリ (Windows の一部として提供されます)。特に、GC 時間の % に興味があります。

redgate ANTS プロファイラーはこれらの統計も監視します。

マネージド ヒープの断片化は通常、オブジェクトの固定が原因で発生します。マネージ コードがオブジェクト ポインターをネイティブ コードに渡すと、オブジェクトは固定されますが、参照がネイティブ コードに渡されるため、オブジェクトは移動できません。これは、I/O アクティビティが多い場合によく発生します。上で述べたように、これは通常 LOH でのみ発生します。

以下にその例を示します Gen0 ヒープの断片化

他の答えがここで指定された状態:あつしていく必要がある。断片化!ませんのみが対象にな管理を盛がすべてのアプリについて少なくとも)

  • 多くの"大きな"ひっ迫に
  • 重配分パターンです。

以降、絡のではなく圧縮での期間に最もうまく分断されたとのサイズと数のオブジェクトを超える価値に関する全体の最大heapsizeります。または、安全な方法は制限の数を瞬時にholded参考文献をオブジェクト。キャッシュ(プール)が作り出すのに役立つだけでな場合、オブジェ貯を再利用することができる。時には、これらがひっ迫した配列の長さの変わる。e., な再利用可能です。なのでプールがありません。

どのように検出可能ですか?がんが大きな圧力に絡heap.どうすぐです。を使用。純性能カウンター"コレクションカウントゲン0...2"でも同時に行います。多数の場合は大型のオブジェり割り当てられる絡、すべてのカウンターに常に同じ.意味は、基本的には全てのコレクション 高価な 2世代ます。その場合、あるべきか。

に関する小物も、GCなすべての作業にGen0コレクションやほので安心です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top