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

首頁 > 學院 > 開發設計 > 正文

.NET的堆和棧04,對托管和非托管資源的垃圾回收以及內存分配

2019-11-14 16:34:19
字體:
來源:轉載
供稿:網友

在" .NET的堆和棧01,基本概念、值類型內存分配"中,了解了"堆"和"棧"的基本概念,以及值類型的內存分配。我們知道:當執行一個方法的時候,值類型實例會在"棧"上分配內存,而引用類型實例會在"堆"上分配內存,當方法執行完畢,"棧"上的實例由操作系統自動釋放,"堆"上的實例由.NET Framework的GC進行回收。


在" .NET的堆和棧02,值類型和引用類型參數傳遞以及內存分配"中,我們了解了值類型參數和引用類型參數在傳遞時的內存分配情況。


在" .NET的堆和棧03,引用類型對象拷貝以及內存分配"中,我們了解了在拷貝引用類型對象時的內存分配情況。

 

而本篇的重點要放在:對托管和非托管資源的垃圾回收、處理以及內存分配情況。

 

主要包括:
■ 什么樣的對象被GC認為是垃圾?
■ GC如何回收?
    □ GC對托管堆中對象的回收
    □ GC對非托管堆中對象的回收、處理
        ※ 對資源的回收
            ○ 通過析構函數回收
            ○ 通過實現IDisposable接口回收
        ※ 對靜態值類型變量的處理
        ※ 對靜態引用類型變量的處理
■ GC何時回收?
■ GC回收之后,又執行哪些操作?       

 

  什么樣的對象被GC認為是垃圾?

當托管堆中的對象不被任何其它對象所引用,這些對象將成為被釋放的垃圾對象等待被GC回收。

 

每個應用程序都有一組根指針,這些根指針是不會被回收的,是由JIT編譯器和CLR運行時維護的一個列表。主要包括:
● 全局/靜態指針:指向全局或局部靜態變量
● 棧指針:指向應用程序線程所需要的那部分棧上空間
● 寄存器指針:指向托管堆所需要的那部分CPU中的內存地址

 

19


以上,假設托管堆中有5個對象,1和5被跟指針引用,3依賴1,那么在這組托管堆對象中,2和4被回收后變成如下:

20

當運行時有新的引用對象產生,將會被放到托管堆中這組對象的最上面。

 

  GC如何回收?

  GC對托管堆中對象的回收

GC采用一定的算法在托管堆中遍歷所有對象,最終形成一個可達對象和不可達對象,不可達對象將被回收。

 

  GC對非托管堆中對象的回收、處理

  對資源的回收

比如文件、數據庫鏈接、網絡鏈接等,這些不再托管堆中的對象如何被回收呢?


1、通過析構函數回收

public class Sample{    //析構函數    ~Sample()    {    }}

 

在托管堆中,那些帶有析構函數的實例,將被放置到"Finalization Queue"中。
21

 

對于那些不被任何其它對象所引用,如果沒有析構函數,比如2,將被直接回收,如果有析構函數,例如4,會被放到"Freachable Queue"中,等待GC實施下一輪回收。
22


當為一個類添加析構函數后,為GC增加了額外的工作,代價是比較昂貴的,更現實的做法是讓類來實現IDisposable接口。

 

2、通過實現IDisposable接口回收

首先讓一個類實現IDisposable接口。

public class ResourceClass : IDisposable{    public void Dispose()    {        //TODO:實現回收邏輯    }}

 

在應用程序中調用如下實施回收。

using(ResourceClass re = new ResourceClass()){    }

 

  對靜態值類型變量的處理

class Counter{          PRivate static int s_Number = 0;           public static int GetNextNumber()          {                     int newNumber = s_Number;                      // DO SOME STUFF                      newNumber += 1;                     s_Number = newNumber;                     return newNumber;          }}

如上,當方法有方法處理靜態字段就需要注意了,2個線程同時調用GetNextNumber()會得到相同的結果,而我們的本意是:每調用一次方法,靜態字段s_Number自增1。

 

我們可以在處理邏輯塊中加鎖,每次只允許一個線程執行。

class Counter{          private static int s_Number = 0;           public static int GetNextNumber()          {                    lock (typeof(Counter))                    {                             int newNumber = s_Number;                              // DO SOME STUFF                              newNumber += 1;                             s_Number = newNumber;                             return newNumber;                    }          }}

 

  對靜態引用類型變量的處理

class Olympics{          public static Collection<Runner> TryoutRunners;} class Runner{          private string _fileName;          private FileStream _fStream;           public void GetStats()          {                    FileInfo fInfo = new FileInfo(_fileName);                    _fStream = _fileName.OpenRead();          }}
以上,在GetStats()方法中,由于沒有對FileStream及時關閉,如果Olympics恰巧有10萬個Runner的集合,10萬Runner都執行沒有關閉FileStream的Gettats()方法,這將是一場災難!

 

Singleton模式可以很好地避免上述問題,它保證了在任何時候,內存中只存在某個類的一個實例。

public class Earth{    private static Earth _instance = new Earth();    private Earth(){}    public static Earth GetInstance(){return _instance;}}

以上,單例模式的必要構成要素包括:
1、私有靜態引用類型變量
2、私有構造函數
3、獲取類實例的靜態方法

 

  GC何時回收?

GC會周期性地執行垃圾回收、內存清理工作,以下情況會啟動GC:
● 托管堆內存不足溢出時
● 調用GC.Collect()方法強制執行垃圾回收
● Windows報告內存不足
● CLR卸載AppDomain

 

  GC回收之后,又執行哪些操作?

GC在垃圾回收之后,托管堆上將出現多個被收集對象的"空洞",為了避免托管堆的內存碎片,會重新分配內存、壓縮托管堆。

 

參考資料:

C# Heap(ing) Vs Stack(ing) in .NET: Part IV

《你必須知道的.NET(第2版)》,作者王濤。

 

".NET的堆和棧"系列包括:

.NET的堆和棧01,基本概念、值類型內存分配

.NET的堆和棧02,值類型和引用類型參數傳遞以及內存分配

.NET的堆和棧03,引用類型對象拷貝以及內存分配

.NET的堆和棧04,對托管和非托管資源的垃圾回收以及內存分配


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久夜色精品国产网站| 欧美野外猛男的大粗鳮| 日韩精品在线免费观看视频| 欧美激情中文字幕乱码免费| 成人国产精品免费视频| 青草青草久热精品视频在线观看| 国产精品日韩在线播放| 国产精品免费久久久久久| 亚洲无限乱码一二三四麻| 日韩最新中文字幕电影免费看| 久久av在线播放| 久久精品国产2020观看福利| 中文字幕亚洲精品| 激情av一区二区| 久久亚洲欧美日韩精品专区| 欧美专区中文字幕| 亚洲午夜小视频| 中文字幕在线亚洲| 欧美在线欧美在线| 中文字幕在线看视频国产欧美在线看完整| 欧美亚洲国产视频| 91国产中文字幕| 欧美亚洲成人xxx| 国产精品久久久久久久久借妻| 国产精品久久久久久久av电影| 亚洲专区在线视频| 欧美野外猛男的大粗鳮| 中文字幕日韩在线播放| 国产欧美日韩专区发布| 精品视频在线播放免| 久久精品青青大伊人av| 亚洲社区在线观看| 亚洲一区二区三区乱码aⅴ| 成人欧美一区二区三区黑人孕妇| 国产区亚洲区欧美区| 精品美女国产在线| 精品久久久久久中文字幕一区奶水| 在线观看欧美日韩国产| 欧美成人sm免费视频| 亚洲国产精品推荐| 国产精品久久二区| 国产精品成人一区| 日韩av色综合| 国产精品激情av电影在线观看| 日韩欧美综合在线视频| 亚洲午夜国产成人av电影男同| 在线国产精品视频| 欧美成人午夜激情在线| 久久精品国产亚洲一区二区| 亚洲精品影视在线观看| 欧美日韩午夜激情| 日韩国产欧美精品在线| 亚洲风情亚aⅴ在线发布| 97成人在线视频| 欧美巨乳在线观看| 秋霞午夜一区二区| 欧美精品生活片| 国产有码在线一区二区视频| 成人黄在线观看| 91高潮在线观看| 欧美一级电影在线| 亚洲福利精品在线| 日韩国产高清污视频在线观看| 日本久久久久久久久| 欧美在线观看网址综合| 日韩免费高清在线观看| 亚洲国产精品一区二区三区| 亚洲人成绝费网站色www| 97久久精品国产| 久久精品精品电影网| 欧美专区福利在线| 精品亚洲国产成av人片传媒| 国模私拍一区二区三区| 亚洲裸体xxxx| 国产小视频国产精品| 亚洲精品一区二区三区婷婷月| 久久人人爽亚洲精品天堂| 久久男人资源视频| 日韩激情av在线播放| 国产精品丝袜视频| 97色在线观看免费视频| 福利二区91精品bt7086| 中文字幕一区二区三区电影| 欧美老妇交乱视频| 伊人青青综合网站| 日韩中文av在线| 91免费的视频在线播放| 欧美综合一区第一页| 成人黄色生活片| 久久午夜a级毛片| 中文字幕亚洲图片| 色妞色视频一区二区三区四区| 全亚洲最色的网站在线观看| 色www亚洲国产张柏芝| 国产精品一区二区三区成人| 日韩国产高清视频在线| 亚洲天堂久久av| 国产精品免费福利| 欧美性生交大片免网| 精品性高朝久久久久久久| 欧美日韩电影在线观看| 91免费看国产| 最新国产成人av网站网址麻豆| 91沈先生在线观看| 4388成人网| 97在线免费观看视频| 91国产精品视频在线| 久久99久久99精品中文字幕| 精品美女永久免费视频| 国产999在线| 亚洲精品一区久久久久久| 国产精品欧美激情在线播放| 亚洲91av视频| 欧美成人精品一区二区三区| 久久av在线播放| 国产精品99久久久久久久久久久久| 亚洲精品一区二三区不卡| 亚洲国产精品一区二区三区| 日韩av网站导航| 日韩精品在线电影| 亚洲成成品网站| 国产精品福利片| 国模精品视频一区二区三区| 国产成人a亚洲精品| 日韩精品日韩在线观看| 国产成人高清激情视频在线观看| 欧美午夜无遮挡| 日韩av综合中文字幕| 美女精品视频一区| 久久成人亚洲精品| 国产精品美女网站| 亚洲精品第一页| 国内外成人免费激情在线视频网站| 久久精品视频va| 国产精品日韩专区| 91色p视频在线| 国内揄拍国内精品少妇国语| 亚洲激情小视频| 亚洲精品国产拍免费91在线| 欧美日韩高清在线观看| 中文字幕亚洲专区| 奇米成人av国产一区二区三区| 国产精品狼人色视频一区| 精品国产电影一区| 亚洲va码欧洲m码| 久久这里有精品视频| 亚洲乱码国产乱码精品精| 性日韩欧美在线视频| 欧美天天综合色影久久精品| 91精品视频观看| 亚洲欧美日韩视频一区| 日韩中文字幕免费视频| 国产精品偷伦免费视频观看的| 日韩欧美在线免费| 久久中文久久字幕| 国内精品久久久久久中文字幕| 日韩国产欧美精品在线| 亚洲成人黄色在线观看| 亚洲男人第一网站| 欧美成人免费在线观看| 精品国产鲁一鲁一区二区张丽| 26uuu亚洲伊人春色| 91视频国产高清| 久久天天躁狠狠躁夜夜躁2014|