淺析C#編程中的內(nèi)存管理

淺析C#編程中的內(nèi)存管理

ID:41033194

大小:35.50 KB

頁數(shù):4頁

時間:2019-08-14

淺析C#編程中的內(nèi)存管理_第1頁
淺析C#編程中的內(nèi)存管理_第2頁
淺析C#編程中的內(nèi)存管理_第3頁
淺析C#編程中的內(nèi)存管理_第4頁
資源描述:

《淺析C#編程中的內(nèi)存管理》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、淺析C#編程中的內(nèi)存管理C#編程的一個優(yōu)點是程序員不需要關(guān)心具體的內(nèi)存管理,尤其是垃圾收集器會處理所有的內(nèi)存清理工作。雖然不必手工管理內(nèi)存,但如果要編寫高質(zhì)量的代碼,還是要理解后臺發(fā)生的事情,理解C#的內(nèi)存管理。本文主要介紹給變量分配內(nèi)存時計算機(jī)內(nèi)存中發(fā)生的情況。C#將數(shù)據(jù)分為兩種:值數(shù)據(jù)類型和引用數(shù)據(jù)類型,這兩種數(shù)據(jù)類型存儲在內(nèi)存中的不同的地方:值數(shù)據(jù)類型存儲在堆棧中,而引用類型存儲在內(nèi)存的托管堆中。1、內(nèi)存簡介Windows使用一個系統(tǒng):虛擬尋址系統(tǒng)。這個系統(tǒng)的作用是將程序可用的內(nèi)存地址映射到硬件內(nèi)存中的實際地址上。

2、其實際結(jié)果就是32位的機(jī)子上每個進(jìn)程都可以使用4GB的內(nèi)存,當(dāng)然,64位機(jī)這個數(shù)字就大了去了。這4GB的內(nèi)存實際上包含了程序的所有的部分:可執(zhí)行代碼,DLL以及程序運行時使用的所有變量的內(nèi)容。這個4GB的內(nèi)存成為虛擬地址空間或虛擬內(nèi)存。為方便,這里成為內(nèi)存。4GB中的每個存儲單元都是從零開始向上存儲的。要訪問存儲在內(nèi)存中的某個空間中的值,就必須提供表示該存儲單元的一個數(shù)字。在高級編程語言中,編譯器的一個重要作用就是負(fù)責(zé)將人們可以理解的變量名稱變?yōu)樘幚砥骺梢岳斫獾膬?nèi)存地址。2、堆棧在內(nèi)存中,有一個區(qū)域成為堆棧,存儲對象對象

3、成員的值數(shù)據(jù)類型調(diào)用方法時,傳遞給所有方法的參數(shù)的副本注意:調(diào)用方法時,堆棧存儲的是所有參數(shù)的副本,因此,經(jīng)值類型A傳遞給函數(shù),A的值是不會變化的。當(dāng)然,引用類型是會變化的,因為在堆棧中存儲的是引用類型的地址,這在后面會有詳細(xì)的介紹。下面以一個例子來說明堆棧的工作方式,如下面的代碼:{  inta;//dosomething;{intb;//dosomething}}首先聲明a,在內(nèi)部的代碼塊中聲明b,然后內(nèi)部的代碼塊終止,b就出了作用域,最后a出作用域。所以b的生命周期總是包含在a的生命周期內(nèi),在釋放變量的時候,其順序

4、總是和分配內(nèi)存的順序是相反的。即:變量的生存周期都是嵌套的。這就是堆棧的工作方式。3、托管堆堆棧具有相當(dāng)高的性能,但是變量的生命周期必須是嵌套的,這個要求在有的時候過于苛刻。我們希望有一種別的方法來分配內(nèi)存,存儲一些數(shù)據(jù),并在方法退出的很長一段時間內(nèi),這些數(shù)據(jù)仍然是可用的,這時,就使用托管堆。托管堆(簡稱堆)是內(nèi)存中的另外一個區(qū)域,我們?nèi)匀挥靡粋€例子來說明堆的工作方式,如下面代碼:{Customercustomer1;customer1=newCustomer();Customercustomer2=newCustome

5、r();//dosomething}首先,聲明一個Customer:customer1,在堆棧上給這個引用分配存儲控件。請注意:僅僅是給這個引用分配存儲空間,并不是實際的Customer對象。customer1占用4個字節(jié)的空間(32位機(jī)),來表示Customer對象在內(nèi)存中的地址。然后,執(zhí)行第二行代碼,完成以下操作:在堆上分配存儲空間,用來存儲Customer對象,注意:這里是Customer對像。將變量customer1的值設(shè)為分配給Customer對象的內(nèi)存地址從這個例子中可以看出,建立引用類型的變量的過程要比獎勵

6、值類型變量的過程復(fù)雜,且不避免的有性能的降低。但是,我們可以將一個引用變量的值賦給另一個引用變量,當(dāng)一個變量出作用域時,它會從堆棧中刪除,但是對象的數(shù)據(jù)仍然保留在內(nèi)存中,直到程序停止。這樣,我們在將一個引用變量A傳遞給函數(shù)時,僅僅是將變量A的引用傳遞給了函數(shù),即:僅僅是在堆棧上分配內(nèi)存,即變量B兩者指向同一個內(nèi)存地址。因此,當(dāng)變量B發(fā)生變化時,變量A也會發(fā)生變化。4、裝箱和拆箱裝箱和拆箱就是值類型和引用類型的項目轉(zhuǎn)化,裝箱可以將值類型轉(zhuǎn)化為引用類型,拆箱的作用正好相反,經(jīng)引用類型轉(zhuǎn)化為值類型。5、垃圾收集一般情況下。NE

7、T運行庫會在認(rèn)為需要的時候運行垃圾收集器來釋放托管資源,這在大多數(shù)情況下,足夠了。就是說我們沒有必要去關(guān)心內(nèi)存。但在有的情況下,我們會強(qiáng)制垃圾回收集器在代碼的某個地方運行,釋放內(nèi)存。這就用到了System.GC.Collect()。System.GC表示一個垃圾收集器。這種情況很少,例如:代碼中大量的對象剛剛停止引用,就適合調(diào)用垃圾收集器??偨Y(jié)首先堆棧和堆(托管堆)都在進(jìn)程的虛擬內(nèi)存中。(在32位處理器上每個進(jìn)程的虛擬內(nèi)存為4GB)堆棧stack堆棧中存儲值類型。堆棧實際上是向下填充,即由高內(nèi)存地址指向地內(nèi)存地址填充。堆

8、棧的工作方式是先分配內(nèi)存的變量后釋放(先進(jìn)后出原則)。堆棧中的變量是從下向上釋放,這樣就保證了堆棧中先進(jìn)后出的規(guī)則不與變量的生命周期起沖突!堆棧的性能非常高,但是對于所有的變量來說還不太靈活,而且變量的生命周期必須嵌套。通常我們希望使用一種方法分配內(nèi)存來存儲數(shù)據(jù),并且方法退出后很長一段時間內(nèi)數(shù)據(jù)仍然可以使用。此時就要

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。