C#內存管理和垃圾回收機制
- 數據類型
- 垃圾回收機制
一、數據類型
C#中的數據類型分為值類型 (Value type) 和引用類型(reference type),
值 類 型: 所有的值類型都集成自 System.ValueType 上,除非加聲明?否則不可為null,保存在 堆棧(Stack,先進後出)上,常見的值類型有:整形、浮點型、bool、枚舉等。
引用類型:所有的引用類型都繼承自System.Object 上,引用類型保存在 托管堆(Head,先進先出)上,常見的類型有:數組、字符串、接口、委托、object等。
拆箱和裝箱:引用類型和值類型的相互轉換叫做拆裝箱操作。
拆箱:拆箱就是將一個引用型對象轉換成任意值型!比如:
int i=0; System.Object obj=i; int j=(int)obj;
裝箱:裝箱就是隱式的將一個值型轉換為引用型對象。比如:
int i=0; Syste.Object obj=i;
二、垃圾回收機制 GC
1、簡介
C#中和Java一樣是一種系統自動回收釋放資源的語言,在C#環境中通過 GC(Garbage Collect)進行系統資源回收,在數據基本類型中介紹到,C#數據類型分為引用類型和值類型,
值類型保存在Stack上,隨著函數的執行作用域執行完畢而自動出棧,所以這一類型的資源不是GC所關心 對象。GC垃圾回收主要是是指保存在Heap上的資源。
.NET的GC機制有這樣兩個問題:
首先,GC並不是能釋放所有的資源。它不能自動釋放非托管資源。
第二,GC並不是實時性的,這將會造成系統性能上的瓶頸和不確定性。
GC並不是實時性的,這會造成系統性能上的瓶頸和不確定性。所以有了IDisposable接口,IDisposable接口定義了Dispose方法,這個方法用來供程序員顯式調用以釋放非托管資源。使用using語句可以簡化資源管理。
2、托管資源和非托管資源
上面介紹到,GC只釋放托管資源,那麽什麽是托管資源和費托管資源。
托管資源 : 托管資源指的是.NET可以自動進行回收的資源,主要是指托管堆上分配的內存資源。托管資源的回收工作是不需要人工幹預的,有.NET運行庫在合適調用垃圾回收器進行回收。
非托管資源:非托管資源指的是.NET不知道如何回收的資源,最常見的一類非托管資源是包裝操作系統資源的對象,例如文件,窗口,網絡連接,數據庫連接,畫刷,圖標 等。這類資源,
垃圾回收器在清理的時候會調用Object.Finalize()方法。默認情況下,方法是空的,對於非托管對象,需要在此方法中編寫回收非托管資源的代碼,以便垃圾回收器正確回收資源。
總結:托管資源是釋放由GC來完成,釋放的時間吧不一定,一般是系統感覺內存吃緊,會進行緊急回收資源。一個對象想成為被回收,首先需要成為垃圾,GC是通過判斷對象及其子對象有沒有指向有效的引用,
如果沒有GC就認為它是垃圾。垃圾回收機制通過一定的算法得到哪些沒有被被引用、或者不再調用的資源,當這些垃圾達到一定的數量時,回啟動垃圾回收機制,GC回收實際上是調用了析構函數。
垃圾回收機制意味著你不需要擔心處理不再需要的對象了。咱們關心的主要是非托管資源的釋放。
3、非托管資源的釋放
在定義一個類時,可以使用兩種不同的機制類釋放非托管資源,這兩周機制有時候通常放在一起使用
1、聲明析構函數(終結器)嗎,作為類的成員
2、在類中實現 System.IDisposable 接口
public class AA { ~AA() { MessageBox.Show("析構函數被執行了"); } }
C#內存管理和垃圾回收機制