中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

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

  《上篇》中我們主要討論的是程序集(Assembly)和應(yīng)用程序域(AppDomain)的話題,著重介紹了兩個(gè)不同的程序集加載方式——獨(dú)占方式和共享方式(中立域方式);以及基于進(jìn)程范圍內(nèi)的字符串駐留。這篇將關(guān)注點(diǎn)放在托管對(duì)象創(chuàng)建時(shí)內(nèi)存的分配和對(duì)大對(duì)象(LO:Large Object)的回收上,不對(duì)之處,還望各位能夠及時(shí)指出。

  一、從類(lèi)型(Type)與實(shí)例(Instance)談起

  在面向?qū)ο蟮氖澜缰校?lèi)型和實(shí)例是兩個(gè)核心的要素。不論是類(lèi)型和實(shí)例,相關(guān)的信息比如加載到內(nèi)存中,對(duì)應(yīng)著某一塊或者多塊連續(xù)或者不連續(xù)的內(nèi)存。那么對(duì)類(lèi)型和實(shí)例的內(nèi)存分配時(shí)如何進(jìn)行的呢?對(duì)象是“狀態(tài)”和“行為”的組合體,所以從.NET Framework的角度來(lái)看類(lèi)型,它只具有兩種類(lèi)型的成員——字段和方法(實(shí)際還有嵌套類(lèi)型),前者表示狀態(tài),后者表示行為。類(lèi)型是對(duì)元數(shù)據(jù)的描述,而實(shí)例則是符合該元數(shù)據(jù)描述的單個(gè)個(gè)體。同一個(gè)類(lèi)型下的所有實(shí)例具有相同的行為,它們通過(guò)狀態(tài)值的不同得以區(qū)分。所以?xún)?nèi)存中的實(shí)例(本篇所說(shuō)的實(shí)例指代引用類(lèi)型的實(shí)例)表示的是字段值,而內(nèi)存中的類(lèi)型表示的則是類(lèi)型成員結(jié)構(gòu)的元數(shù)據(jù)。很多人都知道,當(dāng)我們創(chuàng)建一個(gè)對(duì)象的時(shí)候,CLR會(huì)在GC堆(Heap)中開(kāi)辟一塊連續(xù)的內(nèi)存空間保存字段值。那么類(lèi)型信息又是保存在那塊內(nèi)存上呢?

  實(shí)際上,類(lèi)型信息保存在“另一堆”上,我們稱(chēng)之為加載器堆(Loader Heap)。每一個(gè)應(yīng)用程序域都具有各自的加載器堆,即包括我們創(chuàng)建的普通應(yīng)用程序域,也包括《上篇》中提到的三個(gè)特殊應(yīng)用程序域:系統(tǒng)程序域、共享程序域和默認(rèn)程序域。如果說(shuō)GC堆是實(shí)例的容器,那么基于應(yīng)用程序域的加載器堆就是類(lèi)型的容器。CLR采用“按需加載(這里指的是類(lèi)型,不是程序集)、及時(shí)編譯”的運(yùn)行機(jī)制。當(dāng)某個(gè)類(lèi)型被第一次使用的時(shí)候,CLR試圖加載該類(lèi)型。如果該類(lèi)型對(duì)應(yīng)的程序沒(méi)有獨(dú)自地加載到本應(yīng)用程序域中,或者沒(méi)有通過(guò)中立域的形式加載到共享程序域中,它會(huì)按照相應(yīng)的方式加載程序集(在這里我們假設(shè)采用獨(dú)占方式加載)。然后,將使用到的這個(gè)類(lèi)型加載到本應(yīng)用程序域的加載器堆中。

  加載器堆維護(hù)著自應(yīng)用程序域創(chuàng)建以來(lái)使用過(guò)的所有類(lèi)型記錄,它們對(duì)應(yīng)著一個(gè)特殊的對(duì)象——方法表(Method Table)。當(dāng)程序第一次執(zhí)行到某個(gè)方法的時(shí)候,CLR會(huì)定位到方法表中該條目,獲取相關(guān)信息進(jìn)行JIT編譯。所以如果某個(gè)類(lèi)型在加載器堆中的方法表的某個(gè)條目至少被執(zhí)行一次,它就會(huì)指向一段JIT編譯后的機(jī)器指令。

  二、實(shí)例內(nèi)存分配不僅限于GC堆

  到現(xiàn)在為止,我們知道了類(lèi)型和實(shí)例分別分配于基于應(yīng)用程序域的加載器堆和GC堆中,那么CLR的內(nèi)存分配僅僅限于這“兩堆”嗎?當(dāng)然不是,除了這“兩堆”以及默認(rèn)的進(jìn)程堆,還有額外“兩堆”,一是存放JIT編譯后機(jī)器指令的JIT堆(JIT Heap),另一個(gè)則是專(zhuān)門(mén)用于“大對(duì)象”的大對(duì)象堆(LOH: Large Object Heap)。下圖反映了CLR主要維護(hù)的這些個(gè)不同的“堆”。

image  對(duì)于大對(duì)象堆,在本文后續(xù)部分還會(huì)講述,在這里我們需要先了解CLR認(rèn)為怎樣的對(duì)象是“大對(duì)象”。當(dāng)我們實(shí)例化一個(gè)對(duì)象的時(shí)候,如果該對(duì)象大于或者等于85,000字節(jié)(這種對(duì)象一般是數(shù)組,一般對(duì)象不會(huì)這么大),CLR將認(rèn)為是“大對(duì)象”并被放到LOH中,否則放到GC堆中。這里有一點(diǎn)需要讀者注意的是,作為垃圾回收器的GC并不僅僅限于針對(duì)GC堆中對(duì)象的回收,LOH中的對(duì)象的回收工作通過(guò)在GC的管轄之下。所以從某種意義上講:你可以將之前提到的GC堆理解為SOH(Small Object Heap),或者稱(chēng)之為“狹義GC堆”,而將“廣義GC堆”理解為SOH+LOH。

  三、實(shí)例對(duì)類(lèi)型的引用

  實(shí)例是類(lèi)型的實(shí)例,實(shí)例和它所對(duì)應(yīng)的類(lèi)型需要維持一種聯(lián)系。反映在內(nèi)存中,就以為著分配在GC堆或者是LOH中的對(duì)象具有一個(gè)對(duì)位于加載器堆中該類(lèi)型的方法表的引用。實(shí)例對(duì)類(lèi)型的引用通過(guò)一個(gè)特殊的對(duì)象來(lái)維系——TypeHandle。我們舉個(gè)例子,在如下一段簡(jiǎn)單的對(duì)象實(shí)例化代碼中 ,我先后實(shí)例化了四個(gè)對(duì)象:字符串“ABC”、System.Object對(duì)象、自定義Bar對(duì)象和具有85000個(gè)元素的字節(jié)數(shù)組。

   1: string strInstance         = "ABC";
   2: object objectInstance      = new object();
   3: Bar barInstance            = new Bar()
   4: byte[] largeObjInstance    = new byte[85000];

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

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

主站蜘蛛池模板: 久久久性色精品国产免费观看 | 国产一级免费在线观看 | 我要看黄色录像一级片 | 日本黄色影片在线观看 | 国产精品免费一区二区三区四区 | 国产成人99久久亚洲综合精品 | 中国美女av | 亚洲永久入口 | 最新av中文字幕 | 国产一区二区 | 性高湖久久久久久久久aaaaa | 在线国产一区二区 | 91就要激情 | 日韩精品无码一区二区三区 | 久久99久久98精品免观看软件 | 鲁大师一区影视 | 国产精品美女一区二区三区 | 免费中文字幕日韩欧美 | 一区二区三区高清 | 天天爽综合网 | 亚洲高清视频在线观看 | 免费精品国产 | 成人国产精品久久久 | 亚洲一区欧美 | 99精品福利视频 | 色偷偷人人澡人人爽人人模 | 精品伦精品一区二区三区视频 | 精品真实国产乱文在线 | 精品国产18久久久久久二百 | 九热在线 | 日韩一区二区三区视频在线观看 | 欧美日韩不卡在线 | 免费一级片 | 欧美黄色绿像 | 韩国精品一区二区三区 | 91精品国产91久久久久久最新 | 久久久在线视频 | 亚洲欧美一区二区三区视频 | 日韩小视频 | 成人妇女免费播放久久久 | 特级做a爰片毛片免费看108 |