我需要知道对象在内存中消耗了多少字节(在C#中)。例如我的Hashtable
,SortedList
或List<String>
。
答案 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命令。