如何在内存中获取对象大小?

我需要知道我的对象在内存中消耗了多less字节(在C#中)。 例如我的HashtableSortedListList<String>多less。

 long size = 0; object o = new object(); using (Stream s = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(s, o); size = s.Length; } 

我不认为你可以直接得到它,但有几种方法间接find它。

一种方法是使用GC.GetTotalMemory方法来测量创build对象之前和之后使用的内存量。 这不会是完美的,但只要你控制了应用程序的其余部分,你可能会得到你感兴趣的信息。

除此之外,您可以使用分析器获取信息,也可以使用分析API获取代码中的信息。 但是我觉得这不是一件容易的事情。

请参阅查找C#中的对象正在使用多less内存? 对于类似的问题。

好的,这个问题已经被回答,答案被接受了,但是有人问我把我的答案放在那里。

首先,这是不可能肯定的说。 这是一个内部实现细节,没有logging。 但是,基于另一个对象中包含的对象。 现在,我们如何计算caching对象的内存需求?

我曾经在这篇文章中涉及到这个主题:

现在,我们如何计算caching对象的内存需求? 那么,大多数人会知道,Int32和float是四个字节,double和DateTime 8个字节,char实际上是两个字节(不是一个字节),依此类推。 string有点复杂,2 *(n + 1),其中n是string的长度。 对于对象,它将依赖于它们的成员:总结所有成员的内存需求,记住所有对象引用都是32位框中的4字节指针。 现在,这其实并不是真的,我们没有考虑堆中每个对象的开销。 我不确定你是否需要关心这个问题,但是我想,如果你要使用很多小的对象,那么你就不得不考虑这个开销。 每个堆对象的成本与原始types一样多,外加4个字节的对象引用(在32位机器上,虽然BizTalk在64位机器上也运行32位),外加4个字节的types对象指针,我认为4字节为同步块索引。 为什么这个额外的开销很重要? 好吧,让我们想象我们有一个有两个Int32成员的class级。 在这种情况下,内存要求是16个字节而不是8个。

非托pipe对象:

  • Marshal.SizeOf(object yourObj);

价值types:

  • sizeof(object val)

pipe理对象:

  • 看起来像没有直接的方式来获得pipe理对象,参考: http : //blogs.msdn.com/cbrumme/archive/2003/04/15/51326.aspx

下面的代码片段应该返回传递给它的任何对象的大小(以字节为单位),只要它可以被序列化即可。 我从Quixant的同事那里得到了这个解决在游戏平台上写入SRAM的问题。 希望它有帮助。 感谢Carlo Vittuci。

 /// <summary> /// Calculates the lenght in bytes of an object /// and returns the size /// </summary> /// <param name="TestObject"></param> /// <returns></returns> 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; } 

在debugging模式下

加载SOS

并执行dumpheap命令。

您可以尝试Marshal.SizeOf方法和sizeof关键字。

不知道他们是否会在HashTables等工作,但给它一个去…它可能工作。