クラスAにBとCのインスタンスが含まれているとしましょう。BにはD、E、Fが含まれ、CにはG、H、Iのインスタンスが含まれています。したがって、Aのサイズを計算するときは、そのすべてのサイズとその子のサイズを含めたいと思いますアイテム。!dumpheap -stats コマンドを使用すると、A のサイズに、含まれている子、孫、孫、孫のすべてが含まれていないようです。
windbg 内でこのような方法で A のサイズを取得する方法はありますか?
おもう
!objsize <object address>
あなたが探しているものです。
ただし、単一のオブジェクトに対してのみ機能します (!dumpheap -stat
すべてのオブジェクトを合計しますが、包括的ではありません)。そのタイプのすべてのオブジェクトに対してそれを行いたい場合は!dumpheap -short -type
、ループが必要になります。
Marc Shermanのコメントに対処するには:
ドキュメント !objsize gets the size of the parent and its children によると、孫以降については言及されていません。「ObjSizeコマンドには、親に加えてすべての子オブジェクトのサイズが含まれています。」
!dumpheap
子供を考慮しない:
0:006> !dumpheap -mt 02b24dfc
Address MT Size
02e92410 02b24dfc 28
02e9242c 02b24dfc 28
02e92474 02b24dfc 28
[...]
しかし、次の!objsize
ことを行います。
0:006> !objsize 02e92410
sizeof(02e92410) = 28 (0x1c) bytes (ObjSizeChildren.Object)
0:006> !objsize 02e9242c
sizeof(02e9242c) = 72 (0x48) bytes (ObjSizeChildren.Object)
0:006> !objsize 02e92474
sizeof(02e92474) = 160 (0xa0) bytes (ObjSizeChildren.Object)
このコードで確認しました:
class Program
{
static void Main()
{
var o1 = new Object();
var o2 = new Object {child = new Child()};
var o3 = new Object {child = new Child {grandChild = new GrandChild()}};
Console.WriteLine("Debug now");
Console.ReadLine();
Console.Write(o1);
Console.Write(o2);
Console.Write(o3);
}
}
class Object
{
private long a;
private long b;
public Child child;
}
internal class Child
{
private long a;
private long b;
private long c;
private long d;
public GrandChild grandChild;
}
internal class GrandChild
{
private long a;
private long b;
private long c;
private long d;
private long e;
private long f;
private long g;
private long h;
private long i;
private long j;
}