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

我需要知道我的对象在内存中消耗多少字节(在c#中)。例如,我的Hashtable,或SortedList,或List<String>

349121 次浏览

非托管对象:

  • Marshal.SizeOf(object yourObj);

值类型:

  • sizeof(object val)

管理对象:

我不认为你可以直接得到它,但有一些方法可以间接地找到它。

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

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

类似的问题见找出有多少内存正在被使用的对象在c# ?

调试模式

负载SOS

并执行dumpheap命令。

这可能不准确,但对我来说已经足够接近了

long size = 0;
object o = new object();
using (Stream s = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(s, o);
size = s.Length;
}
下面的代码片段应该返回传递给它的任何对象的字节大小,只要它可以序列化。 我从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;
}

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

首先,这是不可能确定的。它是一个内部实现细节,没有文档化。但是,根据对象所包含的其他对象。现在,我们如何计算缓存对象的内存需求呢?

我之前在文章中触及过这个主题:

现在,我们如何计算缓存的内存需求 对象?你们大多数人都知道,Int32和float是4 字节,double和DateTime 8字节,char实际上是两个字节(不是 一个字节),以此类推。String稍微复杂一点,2*(n+1),其中n 是字符串的长度。对于对象,这将取决于它们 成员:将其所有成员的内存需求相加, 记住所有的对象引用都是32上的4字节指针 一些盒子。现在,这实际上不完全正确,我们没有注意 堆中每个对象的开销。我不确定你是否需要 但我想,如果你会用很多 对于小的物体,你必须把开销考虑进去 考虑。每个堆对象的代价与其基本类型相同, 加上4个字节用于对象引用(在32位机器上,尽管如此 BizTalk在64位机器上也运行32位),再加上4个字节 type对象指针,我认为4字节是同步块索引。为什么 这种额外的开销重要吗?假设我们有一个 类有两个Int32成员;在本例中,内存需求为

. 16字节而不是8字节