1. 程式人生 > >C#內存管理和垃圾回收機制

C#內存管理和垃圾回收機制

委托 釋放 strong 實時性 作用 集成 一定的 簡介 box

  • 數據類型
  • 垃圾回收機制

一、數據類型

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#內存管理和垃圾回收機制