欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談關(guān)于C#的垃圾回收機(jī)制

 更新時(shí)間:2013年03月26日 14:42:38   作者:  
淺談關(guān)于C#的垃圾回收機(jī)制,需要的朋友可以參考一下

  理解C#垃圾回收機(jī)制我們首先說(shuō)一下CLR(公共語(yǔ)言運(yùn)行時(shí),Common Language Runtime)它和Java虛擬機(jī)一樣是一個(gè)運(yùn)行時(shí)環(huán)境,核心功能包括:內(nèi)存管理、程序集加載、安全性、異步處理和線程同步。

CTS(Common Type System)通用類型系統(tǒng),它把.Net中的類型分為2大類,引用類型與值類型。.Net中所有類型都間接或直接派生至System.Object類型。所有的值類型都是System.ValueType的子類,而System.ValueType本身卻是引用類型。


托管資源:
  由CLR管理的存在于托管堆上的稱為托管資源,注意這里有2個(gè)關(guān)鍵點(diǎn),第一是由CLR管理,第二存在于托管堆上。托管資源的回收工作是不需要人工干預(yù)的,CLR會(huì)在合適的時(shí)候調(diào)用GC(垃圾回收器)進(jìn)行回收。

非托管資源:
  非托管資源是不由CLR管理,例如:Image Socket, StreamWriter, Timer, Tooltip, 文件句柄, GDI資源, 數(shù)據(jù)庫(kù)連接等等資源(這里僅僅列舉出幾個(gè)常用的)。這些資源GC是不會(huì)自動(dòng)回收的,需要手動(dòng)釋放。


通過(guò)上面的講述總結(jié)一下,第一,GC(垃圾回收器)只回收托管資源,不回收非托管資源。第二,GC回收是要在合適的時(shí)候(CLR覺(jué)得應(yīng)該進(jìn)行回收的時(shí)候)才進(jìn)行回收。那么非托管如何進(jìn)行回收呢?下面就讓我一一道來(lái)。

在.Net中釋放非托管資源主要有2種方式,Dispose,F(xiàn)inalize

Dispose方法,對(duì)象要繼承IDisposable接口,也就會(huì)自動(dòng)調(diào)用Dispose方法。

復(fù)制代碼 代碼如下:

Class Suifeng:System.IDisposable
{
    #region IDisposable 成員

     public void Dispose()
     {
         //
     }

     #endregion
}

Suifeng suiFeng= new Suifeng ();

suiFeng.Dispose();

//也可以使用Using語(yǔ)句
(using Suifeng suiFeng= new Suifeng())
{
     //
}

Finalize()方法

MSDN上的定義是允許對(duì)象在“垃圾回收”回收之前嘗試釋放資源并執(zhí)行其他清理操作。
它的本質(zhì)就是析構(gòu)函數(shù)

復(fù)制代碼 代碼如下:

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

該析構(gòu)函數(shù)隱式地對(duì)對(duì)象的基類調(diào)用 Finalize。 這樣,前面的析構(gòu)函數(shù)代碼被隱式地轉(zhuǎn)換為以下代碼:

復(fù)制代碼 代碼如下:

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

在.NET中應(yīng)該盡可能的少用析構(gòu)函數(shù)釋放資源,MSDN2上有這樣一段話:
  實(shí)現(xiàn) Finalize 方法或析構(gòu)函數(shù)對(duì)性能可能會(huì)有負(fù)面影響,因此應(yīng)避免不必要地使用它們。用 Finalize 方法回收對(duì)象使用的內(nèi)存需要至少兩次垃圾回收。當(dāng)垃圾回收器執(zhí)行回收時(shí),它只回收沒(méi)有終結(jié)器的不可訪問(wèn)對(duì)象的內(nèi)存。這時(shí),它不能回收具有終結(jié)器的不可訪問(wèn)對(duì)象。它改為將這些對(duì)象的項(xiàng)從終止隊(duì)列中移除并將它們放置在標(biāo)為準(zhǔn)備終止的對(duì)象列表中。該列表中的項(xiàng)指向托管堆中準(zhǔn)備被調(diào)用其終止代碼的對(duì)象。垃圾回收器為此列表中的對(duì)象調(diào)用 Finalize 方法,然后,將這些項(xiàng)從列表中移除。后來(lái)的垃圾回收將確定終止的對(duì)象確實(shí)是垃圾,因?yàn)闃?biāo)為準(zhǔn)備終止對(duì)象的列表中的項(xiàng)不再指向它們。在后來(lái)的垃圾回收中,實(shí)際上回收了對(duì)象的內(nèi)存。


  所以有析構(gòu)函數(shù)的對(duì)象,需要兩次,第一次調(diào)用析構(gòu)函數(shù),第二次刪除對(duì)象。而且在析構(gòu)函數(shù)中包含大量的釋放資源代碼,會(huì)降低垃圾回收器的工作效率,影響性能。所以對(duì)于包含非托管資源的對(duì)象,最好及時(shí)的調(diào)用Dispose()方法來(lái)回收資源,而不是依賴?yán)厥掌鳌?BR>   在一個(gè)包含非托管資源的類中,關(guān)于資源釋放的標(biāo)準(zhǔn)做法是:
   繼承IDisposable接口;
   實(shí)現(xiàn)Dispose()方法,在其中釋放托管資源和非托管資源,并將對(duì)象本身從垃圾回收器中移除(垃圾回收器不在回收此資源);
   實(shí)現(xiàn)類析構(gòu)函數(shù),在其中釋放非托管資源。
   請(qǐng)看MSDN上的源碼  

復(fù)制代碼 代碼如下:

Public class BaseResource:IDisposable
   {
      PrivateIntPtr handle; // 句柄,屬于非托管資源
      PrivateComponet comp; // 組件,托管資源
      Privateboo isDisposed = false; // 是否已釋放資源的標(biāo)志

      PublicBaseResource
      {
      }

       //實(shí)現(xiàn)接口方法
       //由類的使用者,在外部顯示調(diào)用,釋放類資源
       Public void Dispose()
       {
           Dispose(true);// 釋放托管和非托管資源

          //將對(duì)象從垃圾回收器鏈表中移除,
         // 從而在垃圾回收器工作時(shí),只釋放托管資源,而不執(zhí)行此對(duì)象的析構(gòu)函數(shù)

            GC.SuppressFinalize(this);
         }

         //由垃圾回收器調(diào)用,釋放非托管資源

       ~BaseResource()
        {
           Dispose(false);// 釋放非托管資源
        }

     //參數(shù)為true表示釋放所有資源,只能由使用者調(diào)用
    //參數(shù)為false表示釋放非托管資源,只能由垃圾回收器自動(dòng)調(diào)用
   //如果子類有自己的非托管資源,可以重載這個(gè)函數(shù),添加自己的非托管資源的釋放
  //但是要記住,重載此函數(shù)必須保證調(diào)用基類的版本,以保證基類的資源正常釋放
    Protectedvirtual void Dispose(bool disposing)
    {
       If(!this.disposed)// 如果資源未釋放 這個(gè)判斷主要用了防止對(duì)象被多次釋放
         {
            If(disposing)
            {
               Comp.Dispose();// 釋放托管資源
             }

           closeHandle(handle);// 釋放非托管資源
           handle= IntPtr.Zero;
           }
          this.disposed= true; // 標(biāo)識(shí)此對(duì)象已釋放
      }
  }

相關(guān)文章

  • unity中點(diǎn)擊某一個(gè)按鈕播放某一個(gè)動(dòng)作的操作

    unity中點(diǎn)擊某一個(gè)按鈕播放某一個(gè)動(dòng)作的操作

    這篇文章主要介紹了unity中點(diǎn)擊某一個(gè)按鈕播放某一個(gè)動(dòng)作的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • C#跨PC遠(yuǎn)程調(diào)用程序并顯示UI界面

    C#跨PC遠(yuǎn)程調(diào)用程序并顯示UI界面

    這篇文章主要為大家介紹了使用C#跨PC遠(yuǎn)程調(diào)用程序并顯示UI界面,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C#飛機(jī)打字游戲的代碼示例(winform版)

    C#飛機(jī)打字游戲的代碼示例(winform版)

    這篇文章主要介紹了C#飛機(jī)打字游戲的代碼示例(winform版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C#使用Win32?Api實(shí)現(xiàn)進(jìn)程注入到wechat的過(guò)程

    C#使用Win32?Api實(shí)現(xiàn)進(jìn)程注入到wechat的過(guò)程

    這篇文章主要介紹了C#使用Win32?Api實(shí)現(xiàn)進(jìn)程注入到wechat,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • C# 實(shí)現(xiàn)視頻監(jiān)控系統(tǒng)(附源碼)

    C# 實(shí)現(xiàn)視頻監(jiān)控系統(tǒng)(附源碼)

    這篇文章主要介紹了C# 如何實(shí)現(xiàn)視頻監(jiān)控系統(tǒng),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#接口實(shí)現(xiàn)方法實(shí)例分析

    C#接口實(shí)現(xiàn)方法實(shí)例分析

    這篇文章主要介紹了C#接口實(shí)現(xiàn)方法,以實(shí)例形式較為詳細(xì)的分析了C#接口的功能、定義及實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • C# 面向?qū)ο蟮幕驹瓌t

    C# 面向?qū)ο蟮幕驹瓌t

    什么是面向?qū)ο蟮幕驹瓌t?設(shè)計(jì)原則是基本的工具,應(yīng)用這些規(guī)則可以使你的代碼更加靈活、更容易維護(hù),更容易擴(kuò)展。
    2009-11-11
  • C#網(wǎng)絡(luò)編程基礎(chǔ)之進(jìn)程和線程詳解

    C#網(wǎng)絡(luò)編程基礎(chǔ)之進(jìn)程和線程詳解

    這篇文章主要介紹了C#網(wǎng)絡(luò)編程基礎(chǔ)之進(jìn)程和線程詳解,本文對(duì)進(jìn)程、線程、線程池知識(shí)做了淺顯易懂的講解,并配有代碼實(shí)例,需要的朋友可以參考下
    2014-08-08
  • unity shader實(shí)現(xiàn)較完整光照效果

    unity shader實(shí)現(xiàn)較完整光照效果

    這篇文章主要為大家詳細(xì)介紹了unity shader實(shí)現(xiàn)較完整光照效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • c#調(diào)用c++方法介紹,window api

    c#調(diào)用c++方法介紹,window api

    c#在調(diào)用c++方法或者window api時(shí)不能象調(diào)用c#本身寫的dll類庫(kù)那樣直接通過(guò)引用dll就可以調(diào)用相應(yīng)的方法, 而是要把要引用的dll放到bin中,現(xiàn)通過(guò)[DllImport("um_web_client.dll")]引用
    2013-10-10

最新評(píng)論