Memory Model of Reference Type

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

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中)
MethodTable
MethodTable
 

Instance Fields

分配实际字段的空间,不解释
 

Cmonclusion

所以,在32位OS下,一个空的类对象需要12字节的开销,4字节分配在stack上,8字节即为syncblk index 和 type heandler