(c#) 銷毀資源和釋放內存


0. 什么是資源? .NET 框架中如何訪問資源?

所謂的資源就是程序中可利用的數據,譬如:字符串、圖片和任何二進制數據,包括任何類型的文件。

在面向對象的環境中,每一個類型都標識為某些程序所用的資源,要想使用這些資源,必須為相應的類型分配一定的內存空間。

訪問一個資源需要如下幾個步驟:

1)分配內存空間: 調用中間語言(IL)中的newobj指令(使用new操作符時,將產生newobj指令),為某個特定資源的類型分配一定的內存空間。

2) 初始化內存: 一個類型的實例構造器負責這樣的初始化工作。

3)使用資源: 通過訪問類型成員來使用資源。根據需要會有反復。

4)銷毀資源: 執行清理工作。

5)釋放內存: 托管堆上的內存由GC全權負責, 值引用的在棧上的內存會隨着棧空間的消亡而自動消失。

 

1. 什么是托管資源,非托管資源?

托管資源是由CLR全權負責的資源,CLR不負責的資源位非托管資源。 

對於托管資源通過GC自動回收。

對於非托管資源GC管理,通過代碼調用手動進行清除。

 

2. 什么是垃圾, 什么是垃圾回收?

Net類型分為兩大類,一個就是值類型,另一個就是引用類型。前者是分配在棧上,並不需要GC回收;后者是分配在堆上,因此它的內存釋放和回收需要通過GC來完成,

那么只有被稱為垃圾的對象才能被GC回收。也就是說,一個引用類型對象所占用的內存需要被GC回收,需要先成為垃圾。

那么.Net如何判定一個引用類型對象是垃圾呢,.Net的判斷很簡單,只要判定此對象或者其包含的子對象沒有任何引用是有效的,那么系統就認為它是垃圾。

 

內存的釋放和回收需要伴隨着程序的運行,因此系統為GC安排了獨立的線程。那么GC的工作大致是,查詢內存中對象是否成為垃圾,然后對垃圾進行釋放和回收。

那么對於GC對於內存回收采取了一定的優先算法進行輪循回收內存資源。

其次,對於內存中的垃圾分為兩種,一種是需要調用對象的析構函數,另一種是不需要調用的。

GC對於前者的回收需要通過兩步完成,第一步是調用對象的析構函數,第二步是回收內存,但是要注意這兩步不是在GC一次輪循完成,即需要兩次輪循;相對於后者,則只是回收內存。

 

3. 如何正確的釋放資源?

托管的內存資源,這是不需要我們操心的,系統已經為我們進行管理了。

對於非托管的資源,這里再重申一下,就是Stream,數據庫的連接,GDI+的相關對象,還有Com對象等等這些操作系統資源,需要我們手動去釋放。

 

如何去釋放,應該把這些操作放到哪里比較好呢。.Net提供了三種方法,也是最常見的三種,大致如下:

1. 析構函數;

2. 繼承IDisposable接口,實現Dispose方法;

3. 提供Close方法。

 

 

析構函數

Dispose方法

Close方法

意義

銷毀對象

銷毀對象

關閉對象資源

調用方式

不能被顯示調用,會被GC調用

需要顯示調用

或者通過using語句

需要顯示調用

調用時機

不確定

確定,在顯示調用或者離開using程序塊

確定,在顯示調用時

 

 

 

參考: http://blog.csdn.net/knight94/article/details/1023352

http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM