[CLR via C# 3rd讀書筆記]4.4 How Things Relate at Runtime

來源:互聯網
上載者:User

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中儲存的地址

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.