.NET CLR:运行时如何计算对象的大小?

时间:2017-08-21 10:11:57

标签: .net heap clr

对于大小超过 85kb 的对象, .NET中的大对象堆。据我所知,堆中的对象大小像这样计算

  1. 基本类型的所有属性和字段的大小以及值类型的实例(因为它们存储在父实例中)
  2. 对其他类实例的引用大小(因为它们是分开存储的)。
  3. 示例:

    1. 10 引用类型的对象(每个 10kb )和一个包含所有引用类型的对象=>不应将所有物品放入LOH
    2. 2 引用类型的对象(每个 86kb )和包含所有引用类型的对象=> LOH中的2个对象,但是通常堆中的最后一个
    3. 计算架构是否正确?我的例子是否正确?

1 个答案:

答案 0 :(得分:1)

CLR中引用类型的分配成本包括固定开销(取决于体系结构)加上其成员的总量(最终都是值,甚至是引用,4字节或8字节)。 / p>

参考: What is the memory overhead of a .NET Object

它不分配引用对象的内存空间,只分配引用值。

如果分配10KB对象,则不会命中LOH。

如果分配10 x 10KB 的数组,则列表和对象都不在LOH中。该列表实际上是一个10 x 大小的架构引用的数组。

如果你的类是struct,那么列表将包含容纳10KB结构所需的内存空间10次,理论上这将占用列表(并且凭借值类型,对象也是如此) )在LOH上。

不要忘记,List<T>根据算法(目前为x * 2)分配空间。这不是你列入空间的内容,而是列表当前有多少Capacity

LOH分配限制是运行时的实现细节,可能会发生变化。有趣的是看它是如何工作的,但不要构建任何依赖于当前工作方式的东西。

相关问题