【发布时间】:2011-04-01 19:38:31
【问题描述】:
我想知道 C#/.NET 和/或 Visual Studio 中是否有一个简单的命令或指令可以告诉我单个对象占用了多少内存?我有一个偷偷摸摸的怀疑 sizeof() 运算符会骗我......我有这个信念吗?
有一个有点相关的问题here,但没有给出关于如何测量单个物体的明确答案
【问题讨论】:
标签: c# .net memory-management profiling
我想知道 C#/.NET 和/或 Visual Studio 中是否有一个简单的命令或指令可以告诉我单个对象占用了多少内存?我有一个偷偷摸摸的怀疑 sizeof() 运算符会骗我......我有这个信念吗?
有一个有点相关的问题here,但没有给出关于如何测量单个物体的明确答案
【问题讨论】:
标签: c# .net memory-management profiling
没有确定的方法,因为它对于任何类型的对象都不简单。
如果该对象包含对其他对象的引用怎么办?如果那些其他对象有其他对象引用它们怎么办?哪个对象实际拥有该内存空间?是创造它的那个人还是最后一个接触它的人?在任何时候,它都可能有不同的所有者。还是只关心引用占用了多少空间?
还有很多问题也问过这个问题......快速搜索出现了:
How to get object size in memory?
Find out the size of a .net object
How much memory does a C#/.NET object use?
名单还在继续……
【讨论】:
没有简单的方法,sizeof 只适用于值类型。典型对象包含对列表和其他对象的引用,因此您需要遍历所有指针以获得实际字节数,并添加指针大小。
您可以查看 .Net Profiling API,或使用像 dotTrace 这样的内存分析器。内存分析器至少可以帮助您查看内存分配的位置以及内存分配是否是您的应用程序中的问题。这通常比实际的对象大小更有用。
【讨论】:
如果可以的话 - 序列化它!
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
【讨论】:
我想知道System.Runtime.InteropServices.Marshal.SizeOf() 是如何工作的? Marshal 对象下有很多有趣的静态函数,在这里可能会有所帮助。
【讨论】: