2012-02-17 69 views
4

可能重複:
How to get object size in memory?對象的大小在內存

是否有可能知道,顯然在運行時,由對象所採取的內存?怎麼樣?具體來說,我想知道內存的數量。

+1

使用[memory profiler](http://stackoverflow.com/search?q=%5Bc%23%5D+memory+profiler)。 – dtb 2012-02-17 07:24:34

+0

已經有許多愚蠢。發帖前請先搜索。 [如何在內存中獲取對象大小?](http://stackoverflow.com/questions/605621/how-to-get-object-size-in-memory)。而且還http://stackoverflow.com/questions/426396/how-much-memory-does-a-c-net-object-use。還http://www.google.com/#hl=zh-CN&sclient=psy-ab&q=.net+size+of+object+in+memory&pbx=1&oq=.net+size+of+object+in+memory&aq=f&aqi = G1&AQL = 1&gs_sm = 3&gs_upl = 987l6327l0l6549l29l20l0l9l9l5l2247l4909l9.7.0.3.9-1l29l0&BAV = on.2,or.r_gc.r_pw.r_qf。,cf.osb&FP = f0b85e3c6de8b9f9&BIW = 1440&波黑= 795 – 2012-02-17 07:31:20

回答

14

對於值類型,使用sizeof(object value)

對於非託管對象使用Marshal.SizeOf(object obj)

遺憾的是上述兩種不會得到你所引用對象的大小。

對於管理對象:有沒有直接的辦法讓RAM的大小,他們使用的管理對象,請參見:http://blogs.msdn.com/cbrumme/archive/2003/04/15/51326.aspx

或替代方案:

System.GC.GetTotalMemory

long StopBytes = 0; 
foo myFoo; 

long StartBytes = System.GC.GetTotalMemory(true); 
myFoo = new foo(); 
StopBytes = System.GC.GetTotalMemory(true); 
GC.KeepAlive(myFoo); // This ensure a reference to object keeps object in memory 

MessageBox.Show("Size is " + ((long)(StopBytes - StartBytes)).ToString()); 

來源:http://blogs.msdn.com/b/mab/archive/2006/04/24/582666.aspx

Profiler

使用探查器將是最好的。

+0

似乎結果總是0上嘗試這種代碼時列表或數組? – SHM 2017-01-25 19:46:47

+0

注意:如果'new foo()'分配了其他的東西,這會給出不準確的結果,有時候是這樣。 – 2017-01-29 22:31:28

1

您可以使用CLR Profiler看到分配大小爲每種類型的(不特定對象)。也有一些商業產品,可以幫助您監視program.JetBrains內存dotTrace和展鵬Ants的使用是一些他們。