我需要知道我的对象在内存中消耗了多少字节(在C#中).例如,我Hashtable
,或SortedList
,或多少List
.
这可能不准确,但它足够接近我
long size = 0; object o = new object(); using (Stream s = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(s, o); size = s.Length; }
我不认为你可以直接得到它,但有几种方法间接找到它.
一种方法是使用该GC.GetTotalMemory
方法来测量创建对象之前和之后使用的内存量.这不是完美的,但只要您控制应用程序的其余部分,您就可以获得您感兴趣的信息.
除此之外,您可以使用分析器来获取信息,或者您可以使用分析api来获取代码中的信息.但我觉得这并不容易.
请参阅了解C#中对象使用了多少内存?对于类似的问题.
非托管对象:
Marshal.SizeOf(object yourObj);
价值类型:
sizeof(object val)
托管对象:
看起来没有直接获取托管对象的方法,参考:http: //blogs.msdn.com/cbrumme/archive/2003/04/15/51326.aspx
好的,这个问题已经回答并接受了答案,但是有人让我把答案放到你那里去.
首先,不可能肯定地说.这是一个内部实现细节,没有记录.但是,基于另一个对象中包含的对象.现在,我们如何计算缓存对象的内存需求?
我之前在这篇文章中触及了这个主题:
现在,我们如何计算缓存对象的内存需求?好吧,正如大多数人所知,Int32和float是四个字节,double和DateTime是8个字节,char实际上是两个字节(不是一个字节),依此类推.字符串有点复杂,2*(n + 1),其中n是字符串的长度.对于对象,它将取决于它们的成员:只需总结其所有成员的内存需求,记住所有对象引用只是32位框上的4字节指针.现在,这实际上并不完全正确,我们没有处理堆中每个对象的开销.我不确定你是否需要关注这一点,但我想,如果你将使用大量的小物件,你将不得不考虑开销.每个堆对象的成本与其原始类型一样多,加上四个字节用于对象引用(在32位机器上,虽然BizTalk在64位机器上也运行32位),加上4个字节用于类型对象指针,我认为4同步块索引的字节数.为什么这个额外的开销很重要?好吧,让我们假设我们有一个有两个Int32成员的班级; 在这种情况下,内存要求是16个字节而不是8个字节.
以下代码片段应返回传递给它的任何对象的大小(以字节为单位),只要它可以序列化即可.我从Quixant的一位同事那里得到了这个解决在游戏平台上写入SRAM的问题.希望它有所帮助.感谢并感谢Carlo Vittuci.
////// Calculates the lenght in bytes of an object /// and returns the size /// /// ///private int GetObjectSize(object TestObject) { BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); byte[] Array; bf.Serialize(ms, TestObject); Array = ms.ToArray(); return Array.Length; }