如何测量单个对象在.NET中占用的内存量

时间:2010-08-20 18:31:36

标签: c# .net memory-management profiling

我想知道在C#/ .NET和/或Visual Studio中是否有一个简单的命令或指令可以告诉我单个对象占用了多少内存?我有一种潜在的怀疑,即sizeof()操作符会骗我...我是否有理由相信这一点?

有一个相关的问题here,但没有给出关于如何衡量单个对象的确切答案

4 个答案:

答案 0 :(得分:8)

没有确定的方法,因为它对于任何类型的对象都不简单。

如果该对象包含对其他对象的引用,该怎么办?如果那些其他对象有引用它们的其他对象怎么办?哪个对象实际拥有该内存空间?它是创造它的那个还是触摸它的最后一个?在任何一点,它可能有不同的所有者。或者您只关心参考需要多少空间?

还有很多问题也提到了这个问题......快速搜索出现了:

How to get object size in memory?

C#: Memory usage of an object

Find out the size of a .net object

How much memory does a C#/.NET object use?

并且列表继续......

答案 1 :(得分:3)

没有简单的方法,sizeof只会对价值类型有益。典型对象包含对列表和其他对象的引用,因此您需要遍历所有指针以获取实际字节数,并添加指针大小。

您可以查看.Net Profiling API,或使用像dotTrace这样的内存分析器。内存分析器至少可以帮助您查看内存的分配位置以及内存分配是否是应用程序中的问题。这通常比实际对象大小更有用。

答案 2 :(得分:3)

如果可以 - 序列化它!

Dim myObjectSize As Long

Dim ms As New IO.MemoryStream
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(ms, myObject)
myObjectSize = ms.Position

答案 3 :(得分:1)

我想知道System.Runtime.InteropServices.Marshal.SizeOf()是如何运作的? Marshal对象下有很多有趣的静态函数,可能会对此有所帮助。