对于一个引用类型,其在heap上的布局长这样:

object header (syncblk index)
占用四个字节(DWORD),默认为0
索引号是1-indexed的,指向一张
SyncTableEntry 表的某个表项有几个作用:
- 同步锁机制
- 使用
lock语句的时候,CLR会利用syncblk机制为对象分配一个SyncBlock - 这个SyncBlock存储与锁相关的信息,比如线程的锁状态,用于实现线程同步
- HashCode机制
- 如果对象没有重写
GetHashCode方法,CLR会给对象生成一个SyncBlock并在其中生成和缓存一个hashcode - 保证对象的hashcode在生命周期之内保持不变,避免对象在内存中移动时hashcode也跟着变
- 其他metadata(不是很懂)
- 存储跨域索引:用于在多个应用程序域之间跟踪对象
- Thunking数据:在COM互操作或P/Invoke场景中使用的转换数据
顺带一提,SyncTableEntry通过Weak Reference关联到对象实例,不妨碍物体的GC
TypeHandler (a pointer to a MethodTable)
每个类都有一张自己的
MethodTable ,其所有对象实例的TypeHandler 都指向它包含大量信息,包含有关类型的信息(接口,抽象类,具体类,COM Wrapper和代理),实现的接口数,用于方法调用的接口映射,方法表中的插槽数以及表的信息,指向实现的插槽数量(包括虚函数的实现也在这个MethodTable中)

Instance Fields
分配实际字段的空间,不解释
Cmonclusion
所以,在32位OS下,一个空的类对象需要12字节的开销,4字节分配在stack上,8字节即为syncblk index 和 type heandler