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

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

 更新時間:2022年08月13日 09:49:16   作者:Darren?Ji  
這篇文章介紹了ASP.NET堆和棧的基本概念和值類型內(nèi)存分配,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

".NET的堆和棧"系列:

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

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

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

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

當我們對.NET Framework的一些基本面了解之后,實際上,還是很有必要了解一些更底層的知識。比如.NET Framework是如何進行內(nèi)存管理的,是如何垃圾回收的......這樣,我們才能寫出更高性能的程序。

在.NET Framework中,有2個地方幫我們保存管理數(shù)據(jù):一個是"堆",也叫"托管堆",由.NET Framework的垃圾收集器(Garbage Collection, GC)管理;另一個是"棧",也叫"線程堆棧",由操作系統(tǒng)直接管理。它們都寄宿在操作系統(tǒng)內(nèi)存。

 什么是"棧"

可以把"棧"想像成由下而上堆疊起來的盒子,值類型實例存儲于此。

在應(yīng)用程序中,每當調(diào)用一個方法,就相當于在"堆"上放上了一個盒子A,這時,應(yīng)用程序只能使用處在"棧"最上方、剛被放上的這個盒子A,當方法執(zhí)行結(jié)束,相當于把最上方的盒子A扔掉。接下來,剛才還在A下面的盒子B就處在"棧"的最上方了,于是應(yīng)用程序又開始使用盒子B,以此類推。而且,每當把最上面的盒子扔掉,其對應(yīng)的內(nèi)存也被自動釋放。

棧的優(yōu)點是執(zhí)行效率高,缺點是存儲容量有限。

在.NET Framework中,所有派生于System.ValueType的就是值類型,值類型實例位于"棧"。值類型包括:

  • bool
  • byte
  • char
  • decimal
  • double
  • enum
  • float
  • int
  • long
  • sbyte
  • short
  • stuct
  • uint
  • ulong
  • short

什么是"堆"

可以把"堆"想像成一些擺放無序的盒子,引用類型實例存儲于此。

我們可以在任何時候,使用任何盒子。我們需要借助垃圾收集器(Garbage Collection, GC)的自動回收機制或手動處理,以保證"堆"的盒子被及時回收。

另外,根據(jù)引用類型實例的大小,"堆"分為"GC堆"和"LOH(Large Object Heap)堆",當引用類型實例大小小于85000個字節(jié)的時候,實例被分配在"GC堆"上;當實例大小大于或等于于85000個字節(jié)的時候,實例被分配在"LOH(Large Object Heap)堆"。

在.NET Framework中,所有派生于System.Object的就是引用類型,引用類型實例位于"堆"。引用類型包括:

  • 類 class
  • 接口 interface
  • 委托 delegate
  • object
  • string

值類型內(nèi)存分配

在方法內(nèi)的值類型內(nèi)存分配

public int Add(int x)
{
    int result;
    result = x + 2;
    return result;
}

1、在執(zhí)行Add(int x)方法之前,方法參數(shù)x被存放到"棧"的頂部。

2、在"method table"中搜尋Add()方法,如果找不到,就讓JIT及時編譯再存放到"method table"中去。

3、開始執(zhí)行Add(int x)方法,局部變量result也需要"棧"中的一些內(nèi)存。

4、當方法執(zhí)行完畢,先釋放result,再釋放x,線程堆棧指針重新指向。

在引用類型內(nèi)部的值類型內(nèi)存分配

public class MyClass
{
    public int MyValue;
}

public MyClass Add(int x)
{
    MyClass result = new MyClass();
    result.MyValue = x + 2;
    return result;
}

1、在執(zhí)行Add(int x)方法之前,方法參數(shù)x被存放到"棧"的頂部。

2、在"method table"中搜尋Add()方法,如果找不到,就讓JIT及時編譯再存放到"method table"中去。

3、開始執(zhí)行Add(int x)方法,執(zhí)行MyClass result = new MyClass()
先在托管堆上創(chuàng)建一個MyClass的實例,然后在棧上開辟一塊空間并指向?qū)嵗刂贰?/p>

4、當方法執(zhí)行完畢,在棧中由上到下依次釋放內(nèi)存。

此時,在托管堆上的MyClass實例如何處理呢?

5、此時,垃圾回收器登場了,他在托管堆中搜尋那些不再被引用的對象實例,然后實施回收。

練習(xí)題

public int ReturnValue()
{
    int x = new int();
    x = 3;
    int y = new int();
    y = x;      
    y = 4;          
    return x;
}

結(jié)果是:3, 因為值類型x變量,在方法執(zhí)行結(jié)束之前,一直存在于棧上。

public int ReturnValue2()
{
    MyInt x = new MyInt();
    x.MyValue = 3;
    MyInt y = new MyInt();
    y = x;                 
    y.MyValue = 4;              
    return x.MyValue;
}

結(jié)果是:4,因為,當通過y=x把x賦值給y時,實際上是把x在托管堆上的地址賦值y,也就是,棧上的x和y都指向托管堆上的同一個對象實例,改變y的字段值,相當于改變x的字段值。

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

相關(guān)文章

  • asp.net?core?中優(yōu)雅的進行響應(yīng)包裝的實現(xiàn)方法

    asp.net?core?中優(yōu)雅的進行響應(yīng)包裝的實現(xiàn)方法

    本文介紹了 Asp.Net Core 中的通用響應(yīng)包裝的實現(xiàn),以及如何讓 Swagger 識別響應(yīng)包裝,由于異常處理難以做到通用和一致,本文不處理異常情況下的響應(yīng)包裝,讀者可以自定義實現(xiàn) ExceptionFilter
    2022-01-01
  • Asp.Net類型轉(zhuǎn)換類(通用類)代碼分享

    Asp.Net類型轉(zhuǎn)換類(通用類)代碼分享

    本文給大家分享兩段代碼,一段代碼關(guān)于asp.net類型轉(zhuǎn)換通用類的代碼,第二段關(guān)于asp.net 頁面數(shù)據(jù)驗證通用類的實例代碼,代碼簡單易懂,非常不錯,感興趣的朋友參考下吧
    2016-01-01
  • ASP.NET?Core使用自定義日志中間件

    ASP.NET?Core使用自定義日志中間件

    這篇文章介紹了ASP.NET?Core使用自定義日志中間件的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • .NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時

    .NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時

    這篇文章主要介紹了.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • ASP.NET單選按鈕控件RadioButton常用屬性和方法介紹

    ASP.NET單選按鈕控件RadioButton常用屬性和方法介紹

    RadioButton又稱單選按鈕,其在工具箱中的圖標為 ,單選按鈕通常成組出現(xiàn),用于提供兩個或多個互斥選項,即在一組單選鈕中只能選擇一個
    2014-04-04
  • 較為全面的Asp.net提交驗證方案分析 (上)

    較為全面的Asp.net提交驗證方案分析 (上)

    以前在學(xué)習(xí)Asp.net時備受困擾的就是提交驗證這塊,網(wǎng)上流行的關(guān)于圖片驗證的教程大都存在很多問題
    2008-10-10
  • ASP.NET?Core?6框架揭秘實例演示之如何承載你的后臺服務(wù)

    ASP.NET?Core?6框架揭秘實例演示之如何承載你的后臺服務(wù)

    這篇文章主要介紹了ASP.NET?Core?6框架揭秘實例演示之如何承載你的后臺服務(wù),主要包括利用承載服務(wù)收集性能指標、依賴注入的應(yīng)用、配置選項的應(yīng)用等知識點,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • ASP.NET?MVC擴展帶驗證的單選按鈕

    ASP.NET?MVC擴展帶驗證的單選按鈕

    這篇文章實現(xiàn)了ASP.NET?MVC擴展帶驗證的單選按鈕功能,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • asp.net實現(xiàn)輸出xml的方法

    asp.net實現(xiàn)輸出xml的方法

    這篇文章主要介紹了asp.net實現(xiàn)輸出xml的方法,涉及asp.net針對xml節(jié)點的查詢、創(chuàng)建、修改、生成等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11

最新評論

甘南县| 东乡族自治县| 兴海县| 大名县| 林州市| 光泽县| 灌南县| 达孜县| 云林县| 巫溪县| 伊通| 钟山县| 赞皇县| 浙江省| 北宁市| 厦门市| 剑河县| 合水县| 大连市| 阳原县| 来安县| 方山县| 吐鲁番市| 淄博市| 兴业县| 开封县| 鄂托克旗| 周宁县| 武城县| 喀喇| 江川县| 乐山市| 浑源县| 大足县| 清河县| 高平市| 三门峡市| 曲麻莱县| 五大连池市| 连平县| 姚安县|