小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

快速理解.NET Framework (3)

 joojo 2007-10-16
理解JIT編譯器

    JIT編譯器作為CLR的一個完整的部分將MSIL代碼編譯成本地代碼并且實時執(zhí)行整批代碼。代碼將會被緩存而下次就會從緩存中讀取代碼再次編譯執(zhí)行(翻譯不出來)

JIT執(zhí)行進程

    CLR類加載器加載MSIL代碼并且將元數(shù)據(jù)加載到內(nèi)存;代碼管理器調(diào)用WinMainDllMain方法。JIT編譯器在其入口方法執(zhí)行之前編譯這個方法。代碼管理器將對象放置在內(nèi)存中并控制代碼的執(zhí)行。垃圾收集器實現(xiàn)對管理堆的周期性檢查識別應(yīng)用程序的無效對象。

    程序執(zhí)行時類型檢查器確保所有對象和值以及對象和值的引用有其合法的類型。類型檢查器也保證代碼的唯一合法操作,否則就拋出異常。代碼在運行時由CLR控制。CLR在以下行為上增強安全性:

  • 像硬盤一樣控制和訪問系統(tǒng)資源
  • 控制和訪問網(wǎng)絡(luò)連接
  • 控制和訪問其他硬件資源
被管理代碼執(zhí)行

    被管理代碼執(zhí)行被認為是由CLR執(zhí)行的進程,具體有以下幾個方面:

  • CLR加載MSIL和應(yīng)用元數(shù)據(jù)
  • CLR執(zhí)行本地代碼,
  • CLR提供自動內(nèi)存管理
  • 被管理的執(zhí)行也實現(xiàn)JIT編輯
  • 封裝類型安全,
  • 增強安全性
  • 處理異常

被管理的執(zhí)行進程

  • 被管理代碼是自解釋性的代碼,它在.NET框架中給CLR多運行時服務(wù)的信息。
  • 這些信息在PE文件里以元數(shù)據(jù)的形式被存儲在MSIL代碼中。元數(shù)據(jù)信息會描述代碼包含的類型。
  • 被管理數(shù)據(jù)是由垃圾收集器自動被分配和釋放的。被管理代碼能被被管理數(shù)據(jù)理解而非管理數(shù)據(jù)能被被管理理解。(翻的不正確)

內(nèi)存管理

  • 自動內(nèi)存管理意味著當(dāng)對象創(chuàng)建時不需要編寫代碼分配內(nèi)存或是當(dāng)應(yīng)用程序不需要對象時釋放內(nèi)存。
  • 自動內(nèi)存管理的進程包括下列任務(wù):


?分配內(nèi)存

 

  • 當(dāng)一個進程被初始化時,運行時保留了一個連續(xù)的地址空間而不為它分配任何存儲空間。
  • 這個保留的地址空間被叫做托管堆。托管堆在下一個對象被放置的地方保留了一個指針。
  • 當(dāng)一個應(yīng)用程序使用new操作符創(chuàng)建一個對象時,new操作符檢查堆內(nèi)對象所需的內(nèi)存是否可用。
  • 當(dāng)下一個對象創(chuàng)建的時候,垃圾收集器在托管堆分配內(nèi)存給對象。
  • 在托管堆分配內(nèi)存給對象的時間比分配非托管堆內(nèi)存耗時要少。
  • 在非托管堆中,指向內(nèi)存的指針在鏈表數(shù)據(jù)結(jié)構(gòu)中維護。因此,分配內(nèi)存需要通過操縱鏈表,尋找能夠容納它的較大的內(nèi)存塊。(此處原文不全)
  • 與訪問非托管內(nèi)存相比你能更快地訪問托管內(nèi)存的對象,因為在托管內(nèi)存分配時,對象總是在托管的地址空間中分配。

?釋放內(nèi)存

 

 


?分配內(nèi)存

 

  • 當(dāng)一個進程被初始化時,運行時保留了一個連續(xù)的地址空間而不為它分配任何存儲空間。
  • 這個保留的地址空間被叫做托管堆。托管堆在下一個對象被放置的地方保留了一個指針。
  • 當(dāng)一個應(yīng)用程序使用new操作符創(chuàng)建一個對象時,new操作符檢查堆內(nèi)對象所需的內(nèi)存是否可用。
  • 當(dāng)下一個對象創(chuàng)建的時候,垃圾收集器在托管堆分配內(nèi)存給對象。
  • 在托管堆分配內(nèi)存給對象的時間比分配非托管堆內(nèi)存耗時要少。
  • 在非托管堆中,指向內(nèi)存的指針在鏈表數(shù)據(jù)結(jié)構(gòu)中維護。因此,分配內(nèi)存需要通過操縱鏈表,尋找能夠容納它的較大的內(nèi)存塊。(此處原文不全)
  • 與訪問非托管內(nèi)存相比你能更快地訪問托管內(nèi)存的對象,因為在托管內(nèi)存分配時,對象總是在托管的地址空間中分配。

?釋放內(nèi)存


  • 垃圾收集器周期性地應(yīng)用程序不再需要的對象中釋放內(nèi)存。
  • 每個應(yīng)用程序有一組根的集合。一些根的集合指向在托管堆存儲位置。每個根指針或者引用托管堆中的一個對象或是被置成空。
  • 一個應(yīng)用程序的一些根的集合由線程棧上的全局靜態(tài)指針,局部變量和引用對象參數(shù)組成。
  • JIT編譯器和運行時維護應(yīng)用程序根的集合的列表。垃圾收集器使用這個列表創(chuàng)建從根的集合列表中獲得的在托管堆中的對象圖表。
  • 當(dāng)垃圾收集器開始運行,它把在托管堆中的所有對象都看作垃圾。
  • 垃圾收集器通過應(yīng)用程序的根的集合列表操作,這個列表定義了在應(yīng)用程序中一些根的集合列表中有相應(yīng)的引用的對象并對可獲得的對象標記。
  • 垃圾收集器也把這樣的對象作為可獲得對象。(不知道是什么意思)
  • 垃圾收集器認為所有托管堆中不可獲得的對象是垃圾。
  • 垃圾收集器通使用收集進程釋放垃圾對象空間。
  • 垃圾收集器使用內(nèi)存復(fù)制功能來壓縮托管堆中的對象。
  • 垃圾收集器更新應(yīng)用程序根的集合列表中的指針,使得指向較早的應(yīng)用程序一些根的集合正確指向?qū)ο蟆?/span>
  • 垃圾收集器使用高度優(yōu)化的機制完成垃圾收集。它把托管堆中的對象分為三級:0、1、和2。第0級包括最近被創(chuàng)建的對象。
  • 垃圾收集器開始在第0級收集不可獲得的對象。接著,垃圾收集器緊縮內(nèi)存并將可獲得對象提升為第1級。
  • 幸免于收集進程收集的對象被提升為更高的級別。
  • 垃圾收集器在第1級和第2級搜索不可獲得的對象,僅當(dāng)通過第0級對象的收集進程釋放的內(nèi)存不足以創(chuàng)建一個新的對象時。
  • 垃圾收集器為所有應(yīng)用程序創(chuàng)建的托管對象管理內(nèi)存。
  • 垃圾收集器能通過在對象等Dispose方法中提供清除代碼來顯式釋放這些系統(tǒng)資源。
  • 我們在對象完成工作后需要顯式調(diào)用Dispose方法。

?實現(xiàn)終止化器

  • 終止化器進程允許一個對象在垃圾收集器啟動之前完成清理工作。
  • Finalize方法確保了即使客戶沒有顯式調(diào)用Dispose方法,所使用的資源在對象被垃圾收集時也會從內(nèi)存被釋放。
  • 在垃圾收器集進行垃圾收集時識別對象是垃圾后,它在釋放內(nèi)存前調(diào)用對象的Finalize方法。
  • 終止化器是包含在對象收集之前被執(zhí)行的清理代碼的方法。執(zhí)行清理代碼的進程被叫做終結(jié)。DisposeFinalize方法被叫做終止化器。
  • 對象的Dispose方法會釋放所有資源,包括它的父對象擁有的資源通過調(diào)用父對象的Dispose方法。
  • 我們有兩個方法執(zhí)行Dispose方法:
    • 類用戶能夠調(diào)將被銷毀對象的Dispose方法,或者
    • Finalize方法能在終結(jié)過程中調(diào)用Dispose方法。


以下摘自網(wǎng)友 小新0574 的建議, 謝謝小新0574

2.在“釋放內(nèi)存 ”中提到的“根指針”,這個說法,我個人認為需要斟酌一下。原文是說“a set of roots”,一些根的集合,但把這里的根說成根指針,容易混淆,因為這個根由“global and static object pointers, local variables, and reference object parameters on a thread stack”組成,而這些成員不應(yīng)該統(tǒng)稱為“指針”
3.還有這個詞“Finalizers”,<<.NET框架程序設(shè)計(修訂版)>>的作者是翻譯為終止化器,為覺得這個翻譯比較好,“完成器”有點不妥,太字面化了,沒有說明它的作用。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多