最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

".NET的堆和棧"系列:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

GC如何回收?

GC對托管堆中對象的回收

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

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

對資源的回收

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

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

    }
}

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

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

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

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

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

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

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

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

對靜態(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;
    }
}

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

我們可以在處理邏輯塊中加鎖,每次只允許一個線程執(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;
        }
    }
}

對靜態(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()方法中,由于沒有對FileStream及時關(guān)閉,如果Olympics恰巧有10萬個Runner的集合,10萬Runner都執(zhí)行沒有關(guān)閉FileStream的Gettats()方法,這將是一場災(zāi)難!

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

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、獲取類實例的靜態(tài)方法

GC何時回收?

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

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

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

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

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

相關(guān)文章

  • ASP.NET開發(fā)中經(jīng)常用到10款工具軟件介紹

    ASP.NET開發(fā)中經(jīng)常用到10款工具軟件介紹

    從事.NET開發(fā)也好幾年了,工作過程中積累一些軟件工具,分享給大家,排名不分先后,希望對大家有所幫助。
    2016-04-04
  • linq中的串聯(lián)操作符

    linq中的串聯(lián)操作符

    這篇文章介紹了linq中的串聯(lián)操作符,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 創(chuàng)建基于ASP.NET的SMTP郵件服務(wù)的具體方法

    創(chuàng)建基于ASP.NET的SMTP郵件服務(wù)的具體方法

    Asp.net在System.Web.Mail名稱空間中有一個發(fā)送email的內(nèi)建類,但這僅是cdosys的一個假象。開發(fā)者能使用一個替代的它smtp郵件服務(wù)。在這篇文章里面,我將會展示如何創(chuàng)建一個用于asp.net的功能齊全的smtp郵件服務(wù)
    2013-11-11
  • 在ASP.NET Core5.0中訪問HttpContext的方法步驟

    在ASP.NET Core5.0中訪問HttpContext的方法步驟

    這篇文章主要介紹了在ASP.NET Core5.0中訪問HttpContext的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • ASP.NET遞歸法求階乘解決思路

    ASP.NET遞歸法求階乘解決思路

    遞歸就是在過程或函數(shù)里調(diào)用自身,在使用遞歸策略時,必須有一個明確的遞歸結(jié)束條件,稱為遞歸出口遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設(shè)計程序
    2012-12-12
  • asp.net(c#)文件下載實現(xiàn)代碼

    asp.net(c#)文件下載實現(xiàn)代碼

    本文通過一個實例向大家介紹用C#進行Internet通訊編程的一些基本知識。我們知道.Net類包含了請求/響應(yīng)層、應(yīng)用協(xié)議層、傳輸層等層次。
    2009-11-11
  • .NET?Core項目使用swagger開發(fā)組件

    .NET?Core項目使用swagger開發(fā)組件

    這篇文章介紹了.NET?Core項目使用swagger開發(fā)組件的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • ASP.NET中操作數(shù)據(jù)庫的基本步驟分享

    ASP.NET中操作數(shù)據(jù)庫的基本步驟分享

    ASP.NET中操作數(shù)據(jù)庫的基本步驟分享,學(xué)習(xí)asp.net的朋友可以參考下。
    2011-10-10
  • ASP.NET?MVC使用Boostrap實現(xiàn)產(chǎn)品展示、查詢、排序、分頁

    ASP.NET?MVC使用Boostrap實現(xiàn)產(chǎn)品展示、查詢、排序、分頁

    這篇文章介紹了ASP.NET?MVC使用Boostrap實現(xiàn)產(chǎn)品展示、查詢、排序、分頁的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • .NET 內(nèi)存管理兩種有效的資源釋放方式詳解

    .NET 內(nèi)存管理兩種有效的資源釋放方式詳解

    在.NET中,內(nèi)存管理主要依賴垃圾回收(GC),但對于非托管資源如文件句柄、數(shù)據(jù)庫連接等,需要更細粒度的控制,介紹了使用using語句和顯式調(diào)用Dispose方法兩種方式來管理這些資源,避免內(nèi)存泄漏,感興趣的朋友跟隨小編一起看看吧
    2024-10-10

最新評論

滦南县| 郑州市| 乐清市| 昌江| 和静县| 辽阳市| 七台河市| 凯里市| 应城市| 平度市| 库伦旗| 克拉玛依市| 冀州市| 永年县| 石城县| 东兴市| 辽阳市| 安平县| 高阳县| 盐城市| 万安县| 锦屏县| 栾川县| 古丈县| 同心县| 武邑县| 乌兰浩特市| 大邑县| 丹寨县| 巴中市| 竹溪县| 钦州市| 黄浦区| 香河县| 东阿县| 辉县市| 福清市| 兰考县| 广南县| 鄂伦春自治旗| 上犹县|