0

プログラムでメモリの問題を見つけようとしています。ストレス テストからメモリをダンプし、.NET Memory Profilerにインポートしました。String の 92 インスタンスのみを含む object[] のように見える非常に奇妙なことがあります。 LOHにありました。

私が知っているように、値型と参照型の両方が4バイトのメモリアドレスしか占有しないため、要素の型に関係なく、LOHに割り当てられる大量の要素を持つ配列のみが割り当てられます。したがって、85K が LOH に配置する最小サイズだとすると、配列は 85000/4 = 21000 要素に達する必要があります。

プロファイラーはそれがLOHにあると言っています。申し訳ありませんが、マウスがそのオブジェクト上にある場合にのみ表示される単語を表示できません[]

プロファイラーによると、#404,147 は LOH にあった 92エレメントの詳細をチェック。 すべての object[] 要素がリストされました。インスタンス バイトは大きくなく、まったく無関係だと思います

4

1 に答える 1

1

.NET ランタイムは、object[] 配列をストレージとして使用して静的フィールドを実装するため、LOH に表示される object[] 配列は、静的フィールドのコンテナーとして使用される可能性が最も高くなります。

静的フィールドへのアクセスを最適化するために、ランタイムはフィールドへの直接メモリ アクセスを使用する必要がありますが、フィールドはマネージ配列のエントリとして格納されるため、通常、配列はメモリ内で移動できます。フィールド ストレージが移動しないようにするために、object[] 配列をメモリに固定することもできますが、これはガベージ コレクターのパフォーマンスに大きな影響を与えます。代わりに、サイズが通常のラージ オブジェクトよりもはるかに小さい場合でも、object[] 配列がラージ オブジェクト ヒープに割り当てられます。配列を大きなヒープに配置すると、インスタンスの移動も防止され、世代別ガベージ コレクターにメリットがもたらされます。

于 2013-11-14T10:13:40.977 に答える