溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET堆、棧的基本概念和值類型內存分配是什么

發(fā)布時間:2022-08-13 13:57:22 來源:億速云 閱讀:120 作者:iii 欄目:開發(fā)技術

本篇內容介紹了“ASP.NET堆、棧的基本概念和值類型內存分配是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

".NET的堆和棧"系列:

ASP.NET堆和棧一之基本概念和值類型內存分配

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

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

ASP.NET堆和棧四之對托管和非托管資源垃圾回收和內存分配

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

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

 什么是"棧"

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

ASP.NET堆、棧的基本概念和值類型內存分配是什么

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

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

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

  • bool

  • byte

  • char

  • decimal

  • double

  • enum

  • float

  • int

  • long

  • sbyte

  • short

  • stuct

  • uint

  • ulong

  • short

什么是"堆"

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

ASP.NET堆、棧的基本概念和值類型內存分配是什么

我們可以在任何時候,使用任何盒子。我們需要借助垃圾收集器(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

值類型內存分配

在方法內的值類型內存分配

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

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

ASP.NET堆、棧的基本概念和值類型內存分配是什么

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

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

ASP.NET堆、棧的基本概念和值類型內存分配是什么

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

ASP.NET堆、棧的基本概念和值類型內存分配是什么

在引用類型內部的值類型內存分配

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被存放到"棧"的頂部。

ASP.NET堆、棧的基本概念和值類型內存分配是什么

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

3、開始執(zhí)行Add(int x)方法,執(zhí)行MyClass result = new MyClass()
先在托管堆上創(chuàng)建一個MyClass的實例,然后在棧上開辟一塊空間并指向實例地址。

ASP.NET堆、棧的基本概念和值類型內存分配是什么

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

ASP.NET堆、棧的基本概念和值類型內存分配是什么

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

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

練習題

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

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

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

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

“ASP.NET堆、棧的基本概念和值類型內存分配是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI