[CLR via C# 3rd读书笔记]4.4 How Things Relate at Runtime

JIT之前

在CLR第一次调用一个method时,当然首先要JIT这段代码。

JIT之前就需要CLR保证所需的Assembly都可以成功的被load。如果load成功,CLR会利用Assembly中的metadata在托管堆上创建要使用到的Type本身(Type Object)

Type Object的结构,由两部分组成

第一部分包含Type object pointer,Sync block index(在托管堆上的所有对象都会有这两个Field),以及该Type种定义的static filed

第二部分是该Type定义的method table(包括static方法) 

之后开始JIT

runtime

JIT之后就可以开始执行了。

首先开始执行prologue code(几乎所有method都会有),会为local变量在栈上分配内存,并初始化为null或者0

运行

当需要创建对象

在托管堆上创建,内容包括Type object pointer,Sync block index,以及instance field

之后将Type object pointer指向已经创建好的Type Object,初始化Sync block index以及instance field为null或者0,之后调用构造器

以上完成后,new运算符返回该对象在托管堆上的地址

 当调用static方法

JIT编译器会到该Type Object的method table找到方法入口,JIT这个方法(如果必须)之后执行

当调用一个非virtual的实例方法

JIT编译器尝试到该Type Object的method table找方法入口,如果找不到沿着该对象的继承树往父类找,直到找到,JIT(如果必须)后执行

当调用一个virtual的实例方法

此时JIT编译器会执行一些额外的代码(每次调用这个方法都会执行) ,首先找到调用方在托管堆上的对象,并由其Type object pointer定位到调用方的Type Object,之后就是继续找方法入口balabala

最后执行epilogue code(几乎所有method都会有),做一些清理工作

在进程刚刚开始

CLR会立即在托管堆创建System.Type的Type Object(其Type object pointer指向其自身),在运行时创建的所有Type Object的Type object pointer都指向这个System.Type Type Object

实际上Object.GetType方法就是返回Type object pointer中存储的地址

posted @ 2010-06-25 11:16  jiaxingseng  阅读(433)  评论(0编辑  收藏  举报