我正在尝试找出我的对象占用了多少内存,以查看它们中有多少最终存储在Large Object Heap上(超过85,000字节的任何内容)。
这是不是很简单,只需为int添加4,为long添加8,为每个对象的引用类型等添加4(如果是64位,则为8),或者是否存在方法、属性等的开销?
发布于 2011-07-05 17:36:47
如果你可以-序列化它!
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
发布于 2008-11-28 01:46:42
您正在进入一个高级.NET调试领域。从John Robins debugging books开始。
将WinDBG与Sos.dll ( .NET发行版的一部分)和Sosex.dll扩展一起使用。使用这些工具,您可以真正了解应用程序运行时发生的情况。你会找到上述问题的答案。
(另一个建议是安装Shared Source CLI 2.0,也就是。转子2,看看引擎盖下发生了什么。)
发布于 2008-11-27 15:57:50
除非它是一个巨大的值类型或实例类型(即数千个字段),否则您需要担心的唯一类型是大型数组或字符串。当然,要计算出数组的大小,需要知道元素的大小。
.NET (目前)对齐类型的方式与本机编译器对齐类型的方式非常相似。基本类型具有自然对齐,通常是与其大小最接近的两个整数的四舍五入整数幂:
Single, Int32, UInt32 - 4
IntPtr, UIntPtr, pointers, references - 4 on 32-bit, 8 on 64-bit
Double, Int64, UInt64 - 8
Char, Int16, UInt16 - 2
Byte, SByte - 1
当汇编类型时,编译器将确保任何给定类型的所有字段在实例中的起始偏移量与匹配该类型的边界对齐-假设没有使用显式布局。
用户定义类型本身具有对齐方式,该对齐方式被计算为其所有字段类型中的最高对齐方式。如果有必要,可以扩展类型的大小,以使类型的大小也对齐。
但当然,所有引用类型在大小和对齐方式上仍然只有IntPtr.Size,所以引用类型的大小不会影响该类型的数组。
注意,CLR可以根据其判断来选择与上述不同的布局类型,可能是为了增加高速缓存局部性或减少对齐所需的填充。
https://stackoverflow.com/questions/324053
复制相似问题