假设我有以下课程:
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
将在小对象堆上分配是正确的吗?