一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

關(guān)于CLR內(nèi)存管理一些深層次的討論 [上篇]

  半年之前,PM讓我在部門(mén)內(nèi)部進(jìn)行一次關(guān)于“內(nèi)存泄露”的專(zhuān)題分享,我為此準(zhǔn)備了一份PPT。今天無(wú)意中將其翻出來(lái),覺(jué)得里面提到的關(guān)于CLR下關(guān)于內(nèi)存管理部分的內(nèi)存還有點(diǎn)意思。為此,今天按照PPT的內(nèi)容寫(xiě)了一篇文章。本篇文章不會(huì)在討論那些我們熟悉的話(huà)題,比如“值類(lèi)型引用類(lèi)型具有怎樣的區(qū)別?”、“垃圾回收分為幾個(gè)步驟?”、“Finalizer和Dispose有何不同”、等等,而是討論一些不同的內(nèi)容。整篇文章分上下兩篇,上篇主要談?wù)摰氖?ldquo;程序集(Assembly)和應(yīng)用程序域(AppDomain)”。也許有的地方說(shuō)的不是很正確,希望讀者不吝賜教。

  一、程序集與應(yīng)用程序域

  何謂程序集(Assembly)?它是一個(gè)托管應(yīng)用的基本的部署單元。一個(gè)程序集是自描述的(通過(guò)元數(shù)據(jù))、能夠?qū)嵤┌姹静呗院筒渴鸩呗浴N覂A向于這樣的方式來(lái)定義程序集:“Assembly is a reusable, versionable, and self-describing building block of a CLR application.”從結(jié)構(gòu)組成來(lái)看,一個(gè)程序集主要由三個(gè)部署組成:IL指令、元數(shù)據(jù)和資源。程序集的結(jié)構(gòu)組成如下圖所示。

  那么什么又是應(yīng)用程序域呢?從功能上講,通過(guò)應(yīng)用程序域?qū)崿F(xiàn)的隔離機(jī)制為托管代碼的執(zhí)行提供了一個(gè)安全的邊界。從與程序集的關(guān)系來(lái)講,我們可以將應(yīng)用程序域看成是加載程序集的容器。只有相關(guān)的程序集被CLR加載到相應(yīng)的應(yīng)用程序域中,才談得上代碼的執(zhí)行。

基于應(yīng)用程序域的隔離,歸根結(jié)底是內(nèi)存的隔離。一個(gè)基本的反映就是:在一個(gè)應(yīng)用程序域中創(chuàng)建的對(duì)象,不能直接在另一個(gè)應(yīng)用程序域中使用。這中間需要有一個(gè)基本的跨應(yīng)用程序域傳遞的機(jī)制,我們將這種機(jī)制稱(chēng)之為“封送(Marshaling)”。具體來(lái)講,又具有兩種不同的封送方式:按值封送(MBV:Marshaling By Value )和按引用封送(MBR:Marshaling By Reference)。MBV主要采用序列化的方式,而MBR最典型的就是.ENT Remoting。

  二、系統(tǒng)程序域、共享程序域和默認(rèn)程序域

  當(dāng)托管應(yīng)用被啟動(dòng)后,在執(zhí)行第一句代碼之前,CLR會(huì)先后為我們創(chuàng)建三個(gè)應(yīng)用程序域:系統(tǒng)程序域(System Domain)、共享程序域(Shared Domain)和默認(rèn)程序域(Default Domain),它們分別具有不同的作用。

  • 系統(tǒng)程序域:系統(tǒng)程序域是第一個(gè)被創(chuàng)建的應(yīng)用程序域,同時(shí)也是其他兩個(gè)應(yīng)用程序域的創(chuàng)建者。在該程序域初始化過(guò)程中,由它將msCorLib.dll這個(gè)程序集(這是一個(gè)很重要的程序集,.NET類(lèi)型系統(tǒng)最基本的類(lèi)型定義其中)加載到共享程序域中。此外,駐留的字符串也被保存在此系統(tǒng)程序域中。系統(tǒng)程序域的一個(gè)主要的任務(wù)是追蹤其他所有應(yīng)用程序域的狀態(tài),并負(fù)責(zé)加載和卸載它們;
  • 共享程序域:共享程序域主要用于保存以“中立域(Domain-neutral Domain )”加載的程序集容器。所謂“中立域 ”方式加載的程序集,就是說(shuō)程序集并不被加載到當(dāng)前的程序域中并被該程序域?qū)S茫羌虞d到一個(gè)公共的程序域中被所有程序域共享。
  • 默認(rèn)程序域:我們的托管程序最終就運(yùn)行在該程序域中,默認(rèn)程序域可以通過(guò)System.AppDomain表示。

  三、字符串的駐留

  上面的文字描述實(shí)際上透露一些重要的信息,其中一個(gè)就是字符串的駐留(String Interning)。關(guān)于字符串的駐留,我想大家都不陌生,所以在這里我就不作重復(fù)的介紹了。在這里,我只想討論一個(gè)問(wèn)題:字符串的駐留是基于整個(gè)進(jìn)程的,而不是僅僅基于某個(gè)應(yīng)用程序域。

  從上面的描述我們知道,字符串對(duì)象和一般的引用類(lèi)型對(duì)象具有很大的不同:字符串對(duì)象直接被保存到系統(tǒng)程序域中,而一般的引用類(lèi)型對(duì)象我們都是最終保存在GC堆中。從某種意義上講,在字符串駐留機(jī)制下,字符串也是以“中立域”的方式被加載的,被駐留的字符串能夠被同一個(gè)進(jìn)程下所有應(yīng)用程序域所共享。

  那么,我們是否可以通過(guò)一些比較直觀的方式來(lái)驗(yàn)證這一點(diǎn)。但是,我們不能直接編寫(xiě)程序來(lái)比較兩個(gè)應(yīng)用程序域中字符串是否是相同的引用,但是我們有一些間接的機(jī)制。我個(gè)人喜歡采用的方式是:加鎖。我們?cè)谶\(yùn)行于不同的應(yīng)用程序域的代碼中對(duì)兩個(gè)字符串變量進(jìn)行加鎖,如果程序運(yùn)行的結(jié)果和對(duì)相同的對(duì)象加鎖一樣,那么就可以證明被枷鎖的兩個(gè)對(duì)象實(shí)際上是同一個(gè)對(duì)象。

  為了便于演示,我寫(xiě)一個(gè)如下一個(gè)AppDomainContext,表示某個(gè)AppDomain對(duì)應(yīng)的執(zhí)行上下文。AppDomainContext具有一個(gè)只讀的類(lèi)型為AppDomain的屬性,該屬性通過(guò)構(gòu)造函數(shù)執(zhí)行,最終在靜態(tài)方法NewContext被創(chuàng)建。我們調(diào)用Invoke方法讓指定的方法對(duì)應(yīng)的應(yīng)用程序域中執(zhí)行。

   1: public class AppDomainContext
   2: {
   3:     public AppDomain AppDomain { get; private set; }
   4:     private AppDomainContext(AppDomain appDomain)
   5:     {
   6:         this.AppDomain = appDomain;
   7:     }
   8:     public static AppDomainContext NewContext(string friendlyName)
   9:     {
  10:         return new AppDomainContext(AppDomain.CreateDomain(friendlyName));
  11:     }
  12:  
  13:     public void Invoke<T>(Action<T> action) where T : MarshalByRefObject
  14:     {
  15:         T instance = (T)this.AppDomain.CreateInstanceAndUnwrap(typeof(T).Assembly.FullName, typeof(T).FullName);
  16:         action.Invoke(instance);
  17:     }
  18: }

NET技術(shù)關(guān)于CLR內(nèi)存管理一些深層次的討論 [上篇],轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲资源在线 | 色爱综合网 | 4hu四虎永久地址 | 中文字幕一级毛片视频 | 最新91视频 | 国产一区美女视频 | 美女扒开屁股让男人桶视频网站 | 精品免费国产一区二区三区 | 色视频免费观看高清完整 | 国产人成精品午夜在线观看 | 亚洲另类图片专区 | 精品日本亚洲一区二区三区 | 国产成人乱码一区二区三区 | 四虎精品影院4hutv四虎 | 激情小说图片视频 | 道区二区三区四区 | 亚洲热在线视频 | 激情综合网站 | 视频一区二区在线播放 | 日韩三级一区二区 | 91麻豆国产香蕉久久精品 | 福利片91| 亚洲天堂99| 久久青青草原精品国产软件 | 美女扒开屁股让男人桶视频网站 | 一区二区高清视频在线观看 | 日韩精品视频在线 | 亚洲国产天堂久久综合 | 国产激爽大片高清在线观看 | 日韩欧美伊人久久大香线蕉 | 亚洲成a人一区二区三区 | 伊人热人久久中文字幕 | 国产色中色 | 亚洲欧美在线视频观看 | 福利在线国产 | 国产成人精品影视 | 欧美激情中文字幕一区二区 | 天天色天天操综合网 | 视频一区视频二区在线观看 | 久久亚洲精品玖玖玖玖 | 91久久99久91天天拍拍 |