2

假设我有以下课程:

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

首先,我分配:

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

每个b1, c1, d1都小于 85K,因此它们被分配在小对象堆上。然后我做:

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

问题1:我做!DumpHeap -stat的时候mem的使用是否A包括其成员变量所占用的内存?如果不是,它实际上包括什么?
编辑:在这篇文章中找到了这个问题的答案:http: //blogs.msdn.com/b/tess/archive/2005/11/25/dumpheap-stat-explained-debugging-net-leaks.aspx。有意义的是 mem 的使用A不包括b1, c1, d1. 它包括存储b1, c1, d1引用本身所需的内存。

问题2:是否a1在大对象堆上分配(假设大小b1 + c1 + d1> 85K)?为什么?引用b1, c1, d1指向小对象堆上的对象。那为什么会a1坐在LOH上呢?

问题3:让我们翻转一下。说大小b1超过85K,所以它分配在LOH上。但是要存储对我们的引用,b1, c1, d1我们只需要几个字节。我相信a1将在小对象堆上分配是正确的吗?

4

1 回答 1

1

1)正如您已经发现 A 实例的大小不包括引用对象的大小。但是,如果您想找出大小,请使用该!objsize命令。请记住,如果多个对象引用相同的其他对象,则这些对象的大小将被包含多次。

2) 引用的对象a1未在 LOH 上分配。对象本身小于 85000 字节,所以它是在常规堆上分配的。使用该!gcwhere命令列出给定对象在堆的哪个部分。

b13)如果引用指向一个大对象并不重要。任何实例的大小A将只有三个引用加上一些额外的开销(对类型对象的引用和同步块)。即大小将非常远离LOH 限制。

于 2012-09-05T20:11:03.197 回答