每当创建任何新对象时,都会在堆上创建对象。为每个对象分配的内存有两个附加字段1)类型对象指针2)同步块索引。
这两个字段的用法到底是什么。任何人都可以对此有所了解吗?
答案 0 :(得分:17)
类型对象指针用于表示对象的类型。这是:
所必需的Type
,请查找GetType
对象。syncblock字段主要用于锁定。只有当它需要时它才会被填充,并且当锁定总是无法检测时,CLR会使用“瘦”锁而不需要任何外部数据。否则,它是进程范围表中的一个条目 - 我不知道表中的内容的详细信息,但我想它就像在对象的监视器上等待的线程列表。当然,最重要的信息是当前是否保持锁,由哪个线程以及它的计数是什么(由于.NET锁的重入性)。
如果你调用GetHashCode()
并且它没有被覆盖,同步块也会被填充 - 它基本上使用进程范围的表来分配一个稳定的数字。 (对象的地址不够好,因为它可以随时间变化。)
答案 1 :(得分:4)
答案 2 :(得分:2)
同步块索引由Monitor类在引擎盖下使用,因此也是锁定语句。
答案 3 :(得分:1)
GC也使用一些同步块索引来将对象标记为垃圾,以防它不再被引用。