2

次のクラスがあるとします:

Class A
{
 B b;
 C c;
 D d;
}

まず、次を割り当てます。

var b1 = new B();
var c1 = new C();
var d1 = new D();

それぞれがb1, c1, d185K 未満であるため、小さなオブジェクト ヒープに割り当てられます。それから私は:

var a1 = new A { b = b1, c = c1, d = d1 };

質問 1:のメモリ!DumpHeap -stat使用量にAは、メンバー変数によって占有されているメモリが含まれますか? そうでない場合、実際には何が含まれていますか?
編集: この投稿でこの質問に対する回答が見つかりました: http://blogs.msdn.com/b/tess/archive/2005/11/25/dumpheap-stat-explained-debugging-net-leaks.aspxAのメモリ使用量には、が占有するメモリが含まれていないことは理にかなっていb1, c1, d1ます。b1, c1, d1これには、参照自体を格納するために必要なメモリが含まれます。

質問 2:a1大きなオブジェクト ヒープ (サイズがb1 + c1 + d185K を超えると想定) に割り当てられますか? なんで?参照b1, c1, d1は、小さなオブジェクト ヒープ上のオブジェクトを指しています。それでは、なぜa1LOHに座るのでしょうか?

質問 3: ひっくり返してみましょう。のサイズがb185K を超えると、LOH に割り当てられます。しかし、への参照を保存するb1, c1, d1には、数バイトしか必要ありません。a1それが小さなオブジェクト ヒープに割り当てられると 信じているのは正しいですか?

4

1 に答える 1

1

1)すでにわかっているように、Aのインスタンスのサイズには、参照されるオブジェクトのサイズは含まれていません。ただし、サイズを確認したい場合は、!objsizeコマンドを使用してください。複数のオブジェクトが同じ他のオブジェクトを参照している場合、これらのサイズは複数回含まれることに注意してください。

2)によって参照されるオブジェクトa1は、LOHに割り当てられません。オブジェクト自体は85000バイト未満であるため、通常のヒープに割り当てられます。コマンドを使用して!gcwhere、特定のオブジェクトがヒープのどの部分にあるかをリストします。

b13)参照が大きなオブジェクトを指しているかどうかは関係ありません。のインスタンスのサイズは、A3つの参照に加えて、追加のオーバーヘッド(タイプオブジェクトと同期ブロックへの参照)のみになります。つまり、サイズはLOH制限から非常に遠くなります。

于 2012-09-05T20:11:03.197 に答える