在堆上分配的对象

时间:2009-10-27 06:51:50

标签: .net heap

每当创建任何新对象时,都会在堆上创建对象。为每个对象分配的内存有两个附加字段1)类型对象指针2)同步块索引。

这两个字段的用法到底是什么。任何人都可以对此有所了解吗?

4 个答案:

答案 0 :(得分:17)

类型对象指针用于表示对象的类型。这是:

所必需的
  • 方法查找(vtable)
  • 检查演员表
  • 如果致电Type,请查找GetType对象。

syncblock字段主要用于锁定。只有当它需要时它才会被填充,并且当锁定总是无法检测时,CLR会使用“瘦”锁而不需要任何外部数据。否则,它是进程范围表中的一个条目 - 我不知道表中的内容的详细信息,但我想它就像在对象的监视器上等待的线程列表。当然,最重要的信息是当前是否保持锁,由哪个线程以及它的计数是什么(由于.NET锁的重入性)。

如果你调用GetHashCode()并且它没有被覆盖,同步块也会被填充 - 它基本上使用进程范围的表来分配一个稳定的数字。 (对象的地址不够好,因为它可以随时间变化。)

答案 1 :(得分:4)

类型对象是obj.GetType调用返回的内容

用于同步的同步块

请参阅:

答案 2 :(得分:2)

同步块索引由Monitor类在引擎盖下使用,因此也是锁定语句。

答案 3 :(得分:1)

GC也使用一些同步块索引来将对象标记为垃圾,以防它不再被引用。