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

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

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

  一、從類型(Type)與實例(Instance)談起

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

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

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

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

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

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

  三、實例對類型的引用

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

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

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

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

主站蜘蛛池模板: 国产在线精品一区二区 | 超碰综合| 亚洲三级在线 | 狠狠色香婷婷久久亚洲精品 | 国产精品日韩一区 | 国产日产精品一区二区三区四区 | 国产三级| 久久精品国产一区二区三区 | 亚洲精品影院 | 国产一区二区精品 | 日韩在线国产 | 久久久久久国产 | 二区视频| 一区二区播放 | 国产高清精品在线 | 在线免费av电影 | 国产精品欧美日韩 | 日韩h | 伊人久麻豆社区 | 91传媒在线观看 | 欧洲一区二区在线 | 亚洲成人av一区二区 | 久久噜噜噜精品国产亚洲综合 | 亚洲区视频 | 四虎永久在线精品免费一区二 | 久久久久久久一区二区 | 一区二区三区在线电影 | 人人操日日干 | 亚洲在线一区 | 国产一区二区三区四区三区四 | 在线观看日韩av | 亚洲欧美综合精品另类天天更新 | 天天激情综合 | 久久不卡日韩美女 | 夜久久| 欧美大片一区二区 | 欧美人人 | 日韩欧美精品 | 欧美日韩国产精品激情在线播放 | 在线天堂免费中文字幕视频 | 蜜臀网 |