亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

淺談關于C#的垃圾回收機制

2020-01-24 03:30:50
字體:
來源:轉載
供稿:網友

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

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


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

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


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

在.Net中釋放非托管資源主要有2種方式,Dispose,Finalize

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

復制代碼 代碼如下:

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

     public void Dispose()
     {
         //
     }

     #endregion
}

Suifeng suiFeng= new Suifeng ();

suiFeng.Dispose();

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

Finalize()方法

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

復制代碼 代碼如下:

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

該析構函數隱式地對對象的基類調用 Finalize。 這樣,前面的析構函數代碼被隱式地轉換為以下代碼:

復制代碼 代碼如下:

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

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


  所以有析構函數的對象,需要兩次,第一次調用析構函數,第二次刪除對象。而且在析構函數中包含大量的釋放資源代碼,會降低垃圾回收器的工作效率,影響性能。所以對于包含非托管資源的對象,最好及時的調用Dispose()方法來回收資源,而不是依賴垃圾回收器。
   在一個包含非托管資源的類中,關于資源釋放的標準做法是:
   繼承IDisposable接口;
   實現Dispose()方法,在其中釋放托管資源和非托管資源,并將對象本身從垃圾回收器中移除(垃圾回收器不在回收此資源);
   實現類析構函數,在其中釋放非托管資源。
   請看MSDN上的源碼  

復制代碼 代碼如下:

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

      PublicBaseResource
      {
      }

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

          //將對象從垃圾回收器鏈表中移除,
         // 從而在垃圾回收器工作時,只釋放托管資源,而不執行此對象的析構函數

            GC.SuppressFinalize(this);
         }

         //由垃圾回收器調用,釋放非托管資源

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

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

           closeHandle(handle);// 釋放非托管資源
           handle= IntPtr.Zero;
           }
          this.disposed= true; // 標識此對象已釋放
      }
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久在线免费观看| 亚洲精品久久久久久久久久久久久| 国产在线98福利播放视频| 亲子乱一区二区三区电影| 精品视频在线导航| 久久久久999| 岛国av一区二区三区| 日韩亚洲精品电影| 色777狠狠综合秋免鲁丝| 国产精品第一页在线| 国产精品欧美久久久| 欧美日韩一区免费| 国产日本欧美一区二区三区| 国产视频一区在线| 欧美成人中文字幕在线| 国产999精品久久久| 欧美精品在线免费播放| 日韩电影免费观看在线| 欧美亚洲另类在线| 福利微拍一区二区| 91av网站在线播放| 久久久在线观看| 欧美丝袜美女中出在线| 精品久久久久久久久中文字幕| 国产va免费精品高清在线观看| 亚洲精品欧美一区二区三区| 亚洲人成毛片在线播放| 欧美又大又硬又粗bbbbb| 蜜臀久久99精品久久久久久宅男| 国产在线拍偷自揄拍精品| 中文字幕日韩欧美在线| 精品日韩视频在线观看| 日韩一区二区三区在线播放| 日韩一区二区福利| 国产激情视频一区| 日韩av中文字幕在线播放| 亚洲毛片在线观看| 精品高清一区二区三区| 久久91精品国产91久久久| 成人免费视频xnxx.com| 成人在线激情视频| 国产97在线视频| 欧美日韩中国免费专区在线看| 欧美午夜www高清视频| 欧美整片在线观看| 日韩av男人的天堂| 国产精品久久久久久一区二区| 国产日产亚洲精品| 国产成+人+综合+亚洲欧美丁香花| 91福利视频在线观看| 日韩av免费在线看| 日韩女在线观看| 免费91麻豆精品国产自产在线观看| 91免费看片网站| 91精品中文在线| 欧美一乱一性一交一视频| 亚洲激情小视频| 亚洲成在人线av| 高跟丝袜一区二区三区| 亚洲一二在线观看| 国产成人久久久精品一区| 国产一区二区三区中文| 国产精品久久久久久久久久三级| 国产日韩av高清| 欧美视频中文字幕在线| 最近2019中文字幕在线高清| 亚洲人av在线影院| 欧美视频中文在线看| 中日韩美女免费视频网站在线观看| 欧美大片va欧美在线播放| 精品国产拍在线观看| 日韩av免费一区| 亚洲精品短视频| 亚洲免费电影在线观看| 日韩在线中文字幕| 日韩av高清不卡| 国产精品黄色影片导航在线观看| 91精品国产91久久久久福利| 精品性高朝久久久久久久| 国内精品久久影院| 日韩二区三区在线| 日韩精品中文字幕有码专区| 在线视频欧美日韩| 日韩视频在线免费| 精品亚洲夜色av98在线观看| 亚洲人高潮女人毛茸茸| 国产一区二区黑人欧美xxxx| 91在线观看欧美日韩| 91免费的视频在线播放| 日韩在线播放视频| 亚洲丝袜在线视频| 国产一区二区动漫| 亚洲欧美一区二区三区久久| 国产精品免费小视频| 亚洲欧美中文日韩v在线观看| 大荫蒂欧美视频另类xxxx| 国产精品久久久久久久电影| 国产精品入口福利| 国产精品自产拍在线观看中文| 欧美性xxxx| 国产精品久久久久久久久久小说| 少妇激情综合网| 日韩视频在线免费观看| 久久免费少妇高潮久久精品99| 久久久久五月天| 国产亚洲a∨片在线观看| 91在线视频精品| 欧美日韩激情小视频| 久热在线中文字幕色999舞| 精品电影在线观看| 欧美亚洲一级片| 91深夜福利视频| 亚洲成年人影院在线| 91精品国产自产在线| 不卡av电影院| 精品国产乱码久久久久久天美| 亚洲成人国产精品| 国产亚洲美女精品久久久| 久久久免费在线观看| 91老司机在线| 亚洲在线观看视频网站| 福利二区91精品bt7086| 日韩中文字幕视频在线| 国产剧情久久久久久| 久久6免费高清热精品| 亚洲国产精品资源| 亚洲精品久久久久久久久久久久久| 国产精品青青在线观看爽香蕉| 色偷偷综合社区| 中文字幕欧美日韩| 亚洲跨种族黑人xxx| 中文字幕亚洲综合| 538国产精品一区二区在线| www.久久色.com| 亚洲国语精品自产拍在线观看| 日韩欧美在线中文字幕| 亚洲日本中文字幕免费在线不卡| 日本欧美一级片| 日韩一二三在线视频播| 欧美另类第一页| 久久久免费观看视频| 久久青草福利网站| 欧美老少做受xxxx高潮| 欧美多人爱爱视频网站| 国产亚洲欧洲黄色| 久久久久久久久久久亚洲| 亚洲人成五月天| 亚洲色在线视频| 欧美日韩成人在线播放| 亚洲精品av在线| 亚洲欧美日韩精品久久奇米色影视| 亚洲第一页在线| 九色91av视频| 欧美精品videossex88| 97国产在线观看| 久久久免费高清电视剧观看| 日韩小视频在线| 亚洲v日韩v综合v精品v| 国产欧美在线观看| 自拍偷拍亚洲一区| 日韩中文字幕网址| 一区二区三区黄色| 久久这里只有精品视频首页| 亚洲理论电影网|