2012-08-02 46 views
2
統計輸出

說我有以下類:瞭解大對象堆和DumpHeap

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確實的A內存使用包括由它的成員變量佔用的內存?如果不是,它實際上包含了什麼?
編輯:在這篇文章中找到了這個問題的答案:http://blogs.msdn.com/b/tess/archive/2005/11/25/dumpheap-stat-explained-debugging-net-leaks.aspx。這是有道理的,內存使用A不包括內存佔用b1, c1, d1。它包括存儲b1, c1, d1引用本身所需的內存。

問題2:a1是否在大對象堆上分配(假定大小爲b1 + c1 + d1> 85K)?爲什麼?參考文獻b1, c1, d1指向小物體堆上的物體。那麼爲什麼a1坐在蕙?

問題3:讓我們翻轉它。說b1的大小是超過85K,所以它分配在LOH上。但要存儲對b1, c1, d1的引用,我們只需要幾個字節。我是否相信a1將被分配在小對象堆上?

回答

1

1)由於您已經發現A實例的大小不包括引用對象的大小。但是,如果要查找大小,請使用!objsize命令。請記住,如果多個對象引用相同的其他對象,則這些對象的大小將被多次包含。

2)a1引用的對象沒有分配到LOH。該對象本身小於85000字節,因此它分配在常規堆上。使用!gcwhere命令列出給定對象所在堆的哪部分。

3)b1引用指向一個大對象時無關緊要。 A的任何實例的大小將只有三個引用加上一些額外的開銷(對類型對象和同步塊的引用)。即大小將遠離LOH限制。