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

ASP.NET堆和棧四之對(duì)托管和非托管資源的垃圾回收和內(nèi)存分配

 更新時(shí)間:2022年08月13日 10:01:28   作者:Darren?Ji  
這篇文章介紹了.NET堆和棧中對(duì)托管和非托管資源的垃圾回收和內(nèi)存分配,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

".NET的堆和棧"系列:

ASP.NET堆和棧一之基本概念和值類型內(nèi)存分配

ASP.NET堆和棧二之值類型和引用類型參數(shù)傳遞和內(nèi)存分配

ASP.NET堆和棧三之引用類型對(duì)象拷貝和內(nèi)存分配

ASP.NET堆和棧四之對(duì)托管和非托管資源垃圾的回收和內(nèi)存分配

在" ASP.NET堆和棧一之基本概念和值類型內(nèi)存分配"中,了解了"堆"和"棧"的基本概念,以及值類型的內(nèi)存分配。我們知道:當(dāng)執(zhí)行一個(gè)方法的時(shí)候,值類型實(shí)例會(huì)在"棧"上分配內(nèi)存,而引用類型實(shí)例會(huì)在"堆"上分配內(nèi)存,當(dāng)方法執(zhí)行完畢,"棧"上的實(shí)例由操作系統(tǒng)自動(dòng)釋放,"堆"上的實(shí)例由.NET Framework的GC進(jìn)行回收。

在" ASP.NET堆和棧二之值類型和引用類型參數(shù)傳遞和內(nèi)存分配"中,我們了解了值類型參數(shù)和引用類型參數(shù)在傳遞時(shí)的內(nèi)存分配情況。

在" ASP.NET堆和棧三之引用類型對(duì)象拷貝和內(nèi)存分配"中,我們了解了在拷貝引用類型對(duì)象時(shí)的內(nèi)存分配情況。

而本篇的重點(diǎn)要放在:對(duì)托管和非托管資源的垃圾回收、處理以及內(nèi)存分配情況。

什么樣的對(duì)象被GC認(rèn)為是垃圾?

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

每個(gè)應(yīng)用程序都有一組根指針,這些根指針是不會(huì)被回收的,是由JIT編譯器和CLR運(yùn)行時(shí)維護(hù)的一個(gè)列表。主要包括:

  • 全局/靜態(tài)指針:指向全局或局部靜態(tài)變量
  • 棧指針:指向應(yīng)用程序線程所需要的那部分棧上空間
  • 寄存器指針:指向托管堆所需要的那部分CPU中的內(nèi)存地址

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

當(dāng)運(yùn)行時(shí)有新的引用對(duì)象產(chǎn)生,將會(huì)被放到托管堆中這組對(duì)象的最上面。

GC如何回收?

GC對(duì)托管堆中對(duì)象的回收

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

GC對(duì)非托管堆中對(duì)象的回收、處理

對(duì)資源的回收

比如文件、數(shù)據(jù)庫(kù)鏈接、網(wǎng)絡(luò)鏈接等,這些不再托管堆中的對(duì)象如何被回收呢?

1、通過(guò)析構(gòu)函數(shù)回收
public class Sample
{
    //析構(gòu)函數(shù)
    ~Sample()
    {

    }
}

在托管堆中,那些帶有析構(gòu)函數(shù)的實(shí)例,將被放置到"Finalization Queue"中。

對(duì)于那些不被任何其它對(duì)象所引用,如果沒(méi)有析構(gòu)函數(shù),比如2,將被直接回收,如果有析構(gòu)函數(shù),例如4,會(huì)被放到"Freachable Queue"中,等待GC實(shí)施下一輪回收。

當(dāng)為一個(gè)類添加析構(gòu)函數(shù)后,為GC增加了額外的工作,代價(jià)是比較昂貴的,更現(xiàn)實(shí)的做法是讓類來(lái)實(shí)現(xiàn)IDisposable接口。

2、通過(guò)實(shí)現(xiàn)IDisposable接口回收

首先讓一個(gè)類實(shí)現(xiàn)IDisposable接口。

public class ResourceClass : IDisposable
{
    public void Dispose()
    {
        //TODO:實(shí)現(xiàn)回收邏輯
    }
}

在應(yīng)用程序中調(diào)用如下實(shí)施回收。

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

對(duì)靜態(tài)值類型變量的處理

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;
    }
}

如上,當(dāng)方法有方法處理靜態(tài)字段就需要注意了,2個(gè)線程同時(shí)調(diào)用GetNextNumber()會(huì)得到相同的結(jié)果,而我們的本意是:每調(diào)用一次方法,靜態(tài)字段s_Number自增1。

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

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;
        }
    }
}

對(duì)靜態(tài)引用類型變量的處理

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()方法中,由于沒(méi)有對(duì)FileStream及時(shí)關(guān)閉,如果Olympics恰巧有10萬(wàn)個(gè)Runner的集合,10萬(wàn)Runner都執(zhí)行沒(méi)有關(guān)閉FileStream的Gettats()方法,這將是一場(chǎng)災(zāi)難!

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

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

以上,單例模式的必要構(gòu)成要素包括:
1、私有靜態(tài)引用類型變量
2、私有構(gòu)造函數(shù)
3、獲取類實(shí)例的靜態(tài)方法

GC何時(shí)回收?

GC會(huì)周期性地執(zhí)行垃圾回收、內(nèi)存清理工作,以下情況會(huì)啟動(dòng)GC:

  • 托管堆內(nèi)存不足溢出時(shí)
  • 調(diào)用GC.Collect()方法強(qiáng)制執(zhí)行垃圾回收
  • Windows報(bào)告內(nèi)存不足
  • CLR卸載AppDomain

GC回收之后,又執(zhí)行哪些操作?

GC在垃圾回收之后,托管堆上將出現(xiàn)多個(gè)被收集對(duì)象的"空洞",為了避免托管堆的內(nèi)存碎片,會(huì)重新分配內(nèi)存、壓縮托管堆。

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • ASP.NET Core實(shí)現(xiàn)自定義WebApi模型驗(yàn)證詳解

    ASP.NET Core實(shí)現(xiàn)自定義WebApi模型驗(yàn)證詳解

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core實(shí)現(xiàn)自定義WebApi模型驗(yàn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • ADO.NET制做一個(gè)登錄案例

    ADO.NET制做一個(gè)登錄案例

    這篇文章主要為大家介紹了ADO.NET制做一個(gè)登錄案例的詳細(xì)過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • ASP.NET中Web API的簡(jiǎn)單實(shí)例

    ASP.NET中Web API的簡(jiǎn)單實(shí)例

    Web API框架是一個(gè)面向Http協(xié)議的通信框架,Web API 框架是一個(gè)面向Http協(xié)議的通信框架。Web API 框架目前支持兩種數(shù)據(jù)格式的序列化:Json 及 Xml。在不做任何配置的情況下,則 Web API 會(huì)自動(dòng)把數(shù)據(jù)使用xml進(jìn)行序列化,否則使用 json 序列化,需要的朋友可以參考下
    2015-10-10
  • Asp.Net中的三種分頁(yè)方式總結(jié)

    Asp.Net中的三種分頁(yè)方式總結(jié)

    解決分頁(yè)這個(gè)問(wèn)題搞了一天半,耗時(shí)巨大,現(xiàn)在總結(jié)一下。
    2010-06-06
  • RichTextBox 顯示圖片和word的代碼

    RichTextBox 顯示圖片和word的代碼

    RichTextBox 顯示圖片和word的代碼,需要的朋友可以參考一下
    2013-02-02
  • asp.net listbox實(shí)現(xiàn)單選全選取消

    asp.net listbox實(shí)現(xiàn)單選全選取消

    這篇文章主要介紹了asp.net listbox單選全選取消的應(yīng)用,需要的朋友可以參考下
    2014-02-02
  • 使用Seq搭建免費(fèi)的日志服務(wù)的方法

    使用Seq搭建免費(fèi)的日志服務(wù)的方法

    這篇文章主要介紹了使用Seq搭建免費(fèi)的日志服務(wù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • ASP.NET下備份與還原數(shù)據(jù)庫(kù)代碼

    ASP.NET下備份與還原數(shù)據(jù)庫(kù)代碼

    ASP.NET下備份還原數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下。
    2010-03-03
  • 最詳細(xì)的ASP.NET微信JS-SDK支付代碼

    最詳細(xì)的ASP.NET微信JS-SDK支付代碼

    這篇文章主要為大家介紹了最詳細(xì)的ASP.NET微信JS-SDK支付代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之網(wǎng)站設(shè)置(九)

    ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之網(wǎng)站設(shè)置(九)

    這篇文章主要為大家詳細(xì)介紹了ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之網(wǎng)站設(shè)置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論