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

时间:2009-03-03 09:00:52

标签: c# .net performance memory profiling

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

6 个答案:

答案 0 :(得分:158)

这可能不准确,但它足够接近我

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

答案 1 :(得分:101)

我认为你不能直接得到它,但有几种方法间接找到它。

一种方法是使用GC.GetTotalMemory方法测量创建对象之前和之后使用的内存量。这不是完美的,但只要您控制应用程序的其余部分,您就可以获得您感兴趣的信息。

除此之外,您可以使用分析器来获取信息,或者您可以使用profiling api来获取代码中的信息。但我认为这不容易使用。

有关类似问题,请参阅Find out how much memory is being used by an object in C#?

答案 2 :(得分:26)

好的,这个问题已经回答并接受了答案,但有人让我把答案放到你那里去。

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

我之前在article

中触及了这个主题
  

现在,我们如何计算缓存的内存需求   对象?好吧,正如大多数人所知,Int32和float是四个   bytes,double和DateTime 8个字节,char实际上是两个字节(不是   一个字节),依此类推。字符串有点复杂,2 *(n + 1),其中n   是字符串的长度。对于物体,它将取决于它们   成员:只是总结其所有成员的内存需求,   记住所有对象引用只是32上的4字节指针   位盒。现在,这实际上并不完全正确,我们还没有注意   堆中每个对象的开销。我不确定你是否需要   关心这一点,但我想,如果你将使用很多   对于小物件,你必须把头顶进去   考虑。每个堆对象的成本与其原始类型一样多,   加上四个字节用于对象引用(在32位机器上,但是   BizTalk在64位机器上运行32位,加上4位字节   类型对象指针,我认为同步块索引有4个字节。为什么   这个额外的开销是否重要?好吧,让我们想象一下   有两个Int32成员的类;在这种情况下,内存要求是   16个字节而不是8个。

答案 3 :(得分:25)

非托管对象:

  • Marshal.SizeOf(object yourObj);

价值类型:

  • sizeof(object val)

托管对象:

答案 4 :(得分:15)

以下代码片段应返回传递给它的任何对象的大小(以字节为单位),只要它可以序列化即可。 我从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;
}

答案 5 :(得分:0)

在调试模式下

加载SOS

并执行dumpheap命令。