託管堆與堆疊
記憶體格局通常分為四個區
全域性資料區:存放全域性變數,靜態資料,常量
程式碼區:存放所有的程式程式碼
棧區:存放為執行而分配的區域性變數,引數,返回資料,返回地址等,
堆區:即自由儲存區
值型別變數與引用型別變數的記憶體分配模型也不一樣。為了理解清楚這個問題,讀者首
先必須區分兩種不同型別的記憶體區域:執行緒堆疊(Thread Stack)和託管堆(Managed Heap)。
每個正在執行的程式都對應著一個程序(process),在一個程序內部,可以有一個或多
個執行緒(thread),每個執行緒都擁有一塊“自留地”,稱為“執行緒堆疊”,大小為1M,用於保
存自身的一些資料,比如函式中定義的區域性變數、函式呼叫時傳送的引數值等,這部分記憶體
區域的分配與回收不需要程式設計師干涉。
所有值型別的變數都是線上程堆疊中分配的。
另一塊記憶體區域稱為“堆(heap)”,在.NET 這種託管環境下,堆由CLR 進行管理,所
以又稱為“託管堆(managed heap)”。
用new 關鍵字建立的類的物件時,分配給物件的記憶體單元就位於託管堆中。
在程式中我們可以隨意地使用new 關鍵字建立多個物件,因此,託管堆中的記憶體資源
是可以動態申請並使用的,當然用完了必須歸還。
打個比方更易理解:託管堆相當於一個旅館,其中的房間相當於託管堆中所擁有的記憶體
單元。當程式設計師用new 方法建立物件時,相當於遊客向旅館預訂房間,旅館管理員會先看
一下有沒有合適的空房間,有的話,就可以將此房間提供給遊客住宿。當遊客旅途結束,要
辦理退房手續,房間又可以為其他旅客提供服務了。
從表 1 可以看到,引用型別共有四種:類型別、介面型別、陣列型別和委託型別。
所有引用型別變數所引用的物件,其記憶體都是在託管堆中分配的。
嚴格地說,我們常說的“物件變數”其實是類型別的引用變數。但在實際中人們經常將
引用型別的變數簡稱為“物件變數”,用它來指代所有四種類型的引用變數。
http://blog.csdn.net/baoxuetianxia/article/details/3218913
---------------------
作者:lyncai
來源:CSDN
原文:https://blog.csdn.net/Lyncai/article/details/9664667
版權宣告:本文為博主原創文章,轉載請附上博文連結!