2012-02-17 70 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的使用是一些他们。