網(wǎng)站首頁 編程語言 正文
".NET的堆和棧"系列:
ASP.NET堆和棧一之基本概念和值類型內(nèi)存分配
ASP.NET堆和棧二之值類型和引用類型參數(shù)傳遞和內(nèi)存分配
ASP.NET堆和棧三之引用類型對(duì)象拷貝和內(nèi)存分配
ASP.NET堆和棧四之對(duì)托管和非托管資源垃圾的回收和內(nèi)存分配
當(dāng)我們對(duì).NET Framework的一些基本面了解之后,實(shí)際上,還是很有必要了解一些更底層的知識(shí)。比如.NET Framework是如何進(jìn)行內(nèi)存管理的,是如何垃圾回收的......這樣,我們才能寫出更高性能的程序。
在.NET Framework中,有2個(gè)地方幫我們保存管理數(shù)據(jù):一個(gè)是"堆",也叫"托管堆",由.NET Framework的垃圾收集器(Garbage Collection, GC)管理;另一個(gè)是"棧",也叫"線程堆棧",由操作系統(tǒng)直接管理。它們都寄宿在操作系統(tǒng)內(nèi)存。
?什么是"棧"
可以把"棧"想像成由下而上堆疊起來的盒子,值類型實(shí)例存儲(chǔ)于此。
在應(yīng)用程序中,每當(dāng)調(diào)用一個(gè)方法,就相當(dāng)于在"堆"上放上了一個(gè)盒子A,這時(shí),應(yīng)用程序只能使用處在"棧"最上方、剛被放上的這個(gè)盒子A,當(dāng)方法執(zhí)行結(jié)束,相當(dāng)于把最上方的盒子A扔掉。接下來,剛才還在A下面的盒子B就處在"棧"的最上方了,于是應(yīng)用程序又開始使用盒子B,以此類推。而且,每當(dāng)把最上面的盒子扔掉,其對(duì)應(yīng)的內(nèi)存也被自動(dòng)釋放。
棧的優(yōu)點(diǎn)是執(zhí)行效率高,缺點(diǎn)是存儲(chǔ)容量有限。
在.NET Framework中,所有派生于System.ValueType的就是值類型,值類型實(shí)例位于"棧"。值類型包括:
- bool
- byte
- char
- decimal
- double
- enum
- float
- int
- long
- sbyte
- short
- stuct
- uint
- ulong
- short
什么是"堆"
可以把"堆"想像成一些擺放無序的盒子,引用類型實(shí)例存儲(chǔ)于此。
我們可以在任何時(shí)候,使用任何盒子。我們需要借助垃圾收集器(Garbage Collection, GC)的自動(dòng)回收機(jī)制或手動(dòng)處理,以保證"堆"的盒子被及時(shí)回收。
另外,根據(jù)引用類型實(shí)例的大小,"堆"分為"GC堆"和"LOH(Large Object Heap)堆",當(dāng)引用類型實(shí)例大小小于85000個(gè)字節(jié)的時(shí)候,實(shí)例被分配在"GC堆"上;當(dāng)實(shí)例大小大于或等于于85000個(gè)字節(jié)的時(shí)候,實(shí)例被分配在"LOH(Large Object Heap)堆"。
在.NET Framework中,所有派生于System.Object的就是引用類型,引用類型實(shí)例位于"堆"。引用類型包括:
- 類 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及時(shí)編譯再存放到"method table"中去。
3、開始執(zhí)行Add(int x)方法,局部變量result也需要"棧"中的一些內(nèi)存。
4、當(dāng)方法執(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及時(shí)編譯再存放到"method table"中去。
3、開始執(zhí)行Add(int x)方法,執(zhí)行MyClass result = new MyClass()
先在托管堆上創(chuàng)建一個(gè)MyClass的實(shí)例,然后在棧上開辟一塊空間并指向?qū)嵗刂贰?/p>
4、當(dāng)方法執(zhí)行完畢,在棧中由上到下依次釋放內(nèi)存。
此時(shí),在托管堆上的MyClass實(shí)例如何處理呢?
5、此時(shí),垃圾回收器登場(chǎng)了,他在托管堆中搜尋那些不再被引用的對(duì)象實(shí)例,然后實(shí)施回收。
練習(xí)題
public int ReturnValue()
{
int x = new int();
x = 3;
int y = new int();
y = x;
y = 4;
return x;
}
結(jié)果是:3, 因?yàn)橹殿愋蛒變量,在方法執(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àn)椋?dāng)通過y=x把x賦值給y時(shí),實(shí)際上是把x在托管堆上的地址賦值y,也就是,棧上的x和y都指向托管堆上的同一個(gè)對(duì)象實(shí)例,改變y的字段值,相當(dāng)于改變x的字段值。
原文鏈接:https://www.cnblogs.com/darrenji/p/3844388.html
相關(guān)推薦
- 2022-06-12 C語言詳解熱門考點(diǎn)結(jié)構(gòu)體內(nèi)存對(duì)齊_C 語言
- 2024-03-16 docker 獲取鏡像幾種方式
- 2022-07-18 CSS浮動(dòng)定位與背景樣式
- 2021-11-26 Redis分布式鎖詳細(xì)介紹_Redis
- 2022-09-10 Python?turtle庫(繪制螺旋正方形)_python
- 2023-03-05 Python協(xié)程的四種實(shí)現(xiàn)方式總結(jié)_python
- 2023-07-02 Python+streamlit實(shí)現(xiàn)輕松創(chuàng)建人事系統(tǒng)_python
- 2022-06-29 詳解Shell腳本中^M的問題和解決方案_linux shell
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支