我需要知道我的对象在内存中占用多少字节(C#语言)。例如,我的Hashtable
、SortedList
或List<String>
占用多少字节。
我需要知道我的对象在内存中占用多少字节(C#语言)。例如,我的Hashtable
、SortedList
或List<String>
占用多少字节。
这可能不是完全准确的,但对我来说足够接近了。
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
方法来测量创建对象前后所使用的内存量。虽然不完美,但只要您控制应用程序的其余部分,就可以获得您感兴趣的信息。
除此之外,您可以使用分析器来获取信息,或者您可以在代码中使用profiling api来获取信息。但我认为这不容易使用。
请参阅Find out how much memory is being used by an object in C#?以获取类似问题的答案。
非托管对象:
Marshal.SizeOf(object yourObj);
值类型:
sizeof(object val)
托管对象:
好的,这个问题已经得到回答并被接受,但有人要求我把我的答案放在这里。
首先,我们无法确定。这是一个内部实现细节,没有文档记录。然而,可以根据其他对象中包含的对象来推断。那么,我们如何计算缓存对象的内存需求呢?
我之前在这篇文章中提到过:
那么,我们如何计算缓存对象的内存需求呢?正如大多数人所知道的,Int32和float占用4个字节,double和DateTime占用8个字节,char实际上是两个字节(而不是一个字节),等等。字符串更加复杂,需要2*(n+1)个字节,其中n是字符串的长度。对于对象,它将取决于其成员:只需总结其所有成员的内存需求,记住所有对象引用仅是32位盒子上的4个字节指针即可。现在,这实际上并不完全正确,我们还没有处理堆中每个对象的开销。我不确定您是否需要关心此事,但我认为,如果您将使用大量小对象,则必须考虑开销。每个堆对象的成本与其原始类型相同,加上32位机器上的4个字节对象引用(尽管BizTalk在64位机器上也运行32位),再加上类型对象指针的4个字节,以及我认为同步块索引的4个字节。为什么这种额外的开销很重要?好吧,让我们想象一个有两个Int32成员的类;在这种情况下,内存需求是16字节而不是8字节。
以下代码片段应该返回传递给它的任何对象的字节大小,只要它可以被序列化。 我从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;
}
GC.GetTotalMemory
方法。 - Alexey Khoroshikh