4.4运行时的相互关系 (源代码、IL、JIT编译的代码之间的关系)
-
CLR创建线程时,会创建1M的栈。用于方法传递实参和方法内部的局部变量。(高位向低位构建)
-
线程栈的工作流程:
执行的前后会有两个额外的方法初始化和收尾处理。
A、局部变量压入栈
B、
C、
下图过程解释:
- 1 堆中初始化类型对象--注意是“类型对象”而非“对象”(类型对象指针、同步块索引、静态变量和方法表)
- 2 初始化对象所有字段为null或者0。
- 3 new 操作返回对象e,保存到线程栈。
- 4 调用Employee的静态方法Lookup。CLR定位到类型对象,在类型对象的方法表查找改方法对应的记录项,对方法JIT编译(如有需要),再调用JIT编译好的代码。
- 5 GetYearsEmployed 同理
- 6 调虚实例方法GetProgressReport。调用时,JIT编译器要在方法中生成一些额外的代码(方法每次调用都会执行)。这些代码先检查发出调用的对象(e指向的对象),检查对象内部的“类型对象指针”成员(该成员指向对象的实际类型),然后类型对象方法表中查找被调用方法的记录项,同理以上4中的后面部分。
- 补充:
Type类型对象的类型对象指针指向自己。