日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CLR的简单理解

發布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CLR的简单理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????CLR加載程序生成進程,一個進程中可以存在多個線程,當創建一個線程時,會分配1Mb的空間,也就是線程的??臻g,對應jvm的虛擬機堆棧,是線程執行過程中用到的工作內存。這片內存用于方法傳遞實參,并存儲方法內部定義的局部變量,棧是從高位地址向低位地址構建。棧是由操作系統直接管理,不受GC控制,當執行的方法退出后,棧中的存儲會自動釋放。棧的效率很高,但存儲空間有限。

????????對象的數據存儲在堆上,堆上的數據是所有線程共享的,堆根據類型又分為:GC堆、加載堆(Loader Heap)、大對象(LOH)堆。當對象實例大小小于85000字節時,該對象會被分配到GC堆上,GC回收主要是回收這一片區域,回收過后會進行壓縮。當對象實例大小大于85000個字節時,會被分配到LOH堆,只有GC進行完全回收時這片區域的數據才會被回收,且回收后不會壓縮。

????????加載堆(Loader Heap)用來存儲類型的元數據,也就是類的Type信息,反射的時候就是用到這里面的信息。每個類在加載堆中對應一個方法表(Method Table),里面記錄該類的元數據信息,比如基類型、靜態字段、繼承的接口、所有的方法等。加載堆不受GC控制,不會被回收,其生命周期是從創建(第一次使用)直到AppDomain卸載。

????????當我們在程序中new一個對象時,會根據這個對象的大小(字段數據等)在GC堆中生成這個對象的內存空間,其中字段數據直接在這個對象空間中,同時這個對象會包含兩個引用:TypeHandle和SyncBlockIndex。其中TypeHandle指向加載堆(Loader Heap)中的方法表(Method Table),SyncBlockIndex指針指向Synchronization Block的內存塊,用于在多線程環境下對實例對象的同步操作。當這些都準備好以后,會將GC堆中的內存地址返回給棧中該變量,這里也是整個new的過程。

????????這里有必要對加載堆(Loader Heap)做下補充,其實在類第一次使用(不一定是new)的時候,類的元數據信息就會被放到加載堆(Loader Heap)中。當真正new一個對象的時候,其實加載堆(Loader Heap)中已經有該類的元數據信息,如果沒有,也會先創建。然后再將這個對象的TypeHandle和加載堆中的該類型的MethodTable對應起來。

????????以上所有描述,可參考下圖:

?

總結

以上是生活随笔為你收集整理的CLR的简单理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。