乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      淺談C#垃圾回收

       quasiceo 2014-01-18

      淺談C#垃圾回收

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

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


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

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


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

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

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

      復(fù)制代碼
      Class Suifeng:System.IDisposable
      {
          #region IDisposable 成員
       
           public void Dispose()
           {
               //
           }
       
           #endregion
      }
      
      Suifeng suiFeng= new Suifeng ();
      
      suiFeng.Dispose();
      
      也可以使用Using語句
      (using Suifeng suiFeng= new Suifeng())
      {
           //
      }
      復(fù)制代碼

      Finalize()方法

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

      復(fù)制代碼
      class Car
      {
          ~Car()  // destructor
          {
              // cleanup statements...
          }
      }
      復(fù)制代碼

       


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

      復(fù)制代碼
      protected override void Finalize()
      {
          try
          {
              // Cleanup statements...
          }
          finally
          {
              base.Finalize();
          }
      }
      復(fù)制代碼

       


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


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

      復(fù)制代碼
      Public class BaseResource:IDisposable
         {
            PrivateIntPtr handle; // 句柄,屬于非托管資源
            PrivateComponet comp; // 組件,托管資源
            Privateboo isDisposed = false; // 是否已釋放資源的標(biāo)志
             
            PublicBaseResource
            {
            }
              
             //實現(xiàn)接口方法
             //由類的使用者,在外部顯示調(diào)用,釋放類資源
             Public void Dispose()
             {
                 Dispose(true);// 釋放托管和非托管資源
                                 
                //將對象從垃圾回收器鏈表中移除,
               // 從而在垃圾回收器工作時,只釋放托管資源,而不執(zhí)行此對象的析構(gòu)函數(shù)
      
                  GC.SuppressFinalize(this);
               }
              
               //由垃圾回收器調(diào)用,釋放非托管資源
      
             ~BaseResource()
              {
                 Dispose(false);// 釋放非托管資源
              }
              
           //參數(shù)為true表示釋放所有資源,只能由使用者調(diào)用
          //參數(shù)為false表示釋放非托管資源,只能由垃圾回收器自動調(diào)用
         //如果子類有自己的非托管資源,可以重載這個函數(shù),添加自己的非托管資源的釋放
        //但是要記住,重載此函數(shù)必須保證調(diào)用基類的版本,以保證基類的資源正常釋放
          Protectedvirtual void Dispose(bool disposing)
          {
             If(!this.disposed)// 如果資源未釋放 這個判斷主要用了防止對象被多次釋放
               {
                  If(disposing)
                  {
                     Comp.Dispose();// 釋放托管資源
                   }
                                 
                 closeHandle(handle);// 釋放非托管資源
                 handle= IntPtr.Zero;
                 }
                this.disposed= true; // 標(biāo)識此對象已釋放
            }
        }
      復(fù)制代碼

      參考了MSDN和網(wǎng)上的一些資料,第一次寫博文請各位大俠多多指點(diǎn)!

       

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多