.net – 堆上分配的对象

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

这两个字段的用法是什么?有人可以清楚这一点吗?

类型对象指针用于表示对象的类型.这是必需的:

>方法查找(vtable)
>检查投票
>如果您调用GetType,查找Type对象.

同步块字段主要用于锁定.只有当它需要时,才会被填满,而当一个锁总是无争议的时候,CLR用一个不需要外部数据的“薄”锁来做.否则,它是一个进程范围的表中的一个条目 – 我不知道表中的内容的细节,但我可以想像这是像对象监视器等待的线程列表.当然,最重要的一点是,锁是否被保持,哪个线程和它的计数(由于.NET锁的可重入的性质).

如果您调用GetHashCode()并且它不被覆盖,同步块也会被填充 – 基本上它使用整个流程表来分配一个稳定的数字. (对象的地址不够好,随着时间的推移可以改变.)

翻译自:https://stackoverflow.com/questions/1629100/objects-allocated-on-heap

转载注明原文:.net – 堆上分配的对象