<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
ASP.NET堆和棧二之值型別和參照型別引數傳遞和記憶體分配
ASP.NET堆和棧四之對託管和非託管資源垃圾的回收和記憶體分配
當我們對.NET Framework的一些基本面瞭解之後,實際上,還是很有必要了解一些更底層的知識。比如.NET Framework是如何進行記憶體管理的,是如何垃圾回收的......這樣,我們才能寫出更高效能的程式。
在.NET Framework中,有2個地方幫我們儲存管理資料:一個是"堆",也叫"託管堆",由.NET Framework的垃圾收集器(Garbage Collection, GC)管理;另一個是"棧",也叫"執行緒堆疊",由作業系統直接管理。它們都寄宿在作業系統記憶體。
可以把"棧"想像成由下而上堆疊起來的盒子,值型別範例儲存於此。
在應用程式中,每當呼叫一個方法,就相當於在"堆"上放上了一個盒子A,這時,應用程式只能使用處在"棧"最上方、剛被放上的這個盒子A,當方法執行結束,相當於把最上方的盒子A扔掉。接下來,剛才還在A下面的盒子B就處在"棧"的最上方了,於是應用程式又開始使用盒子B,以此類推。而且,每當把最上面的盒子扔掉,其對應的記憶體也被自動釋放。
棧的優點是執行效率高,缺點是儲存容量有限。
在.NET Framework中,所有派生於System.ValueType的就是值型別,值型別範例位於"棧"。值型別包括:
可以把"堆"想像成一些擺放無序的盒子,參照型別範例儲存於此。
我們可以在任何時候,使用任何盒子。我們需要藉助垃圾收集器(Garbage Collection, GC)的自動回收機制或手動處理,以保證"堆"的盒子被及時回收。
另外,根據參照型別範例的大小,"堆"分為"GC堆"和"LOH(Large Object Heap)堆",當參照型別範例大小小於85000個位元組的時候,範例被分配在"GC堆"上;當範例大小大於或等於於85000個位元組的時候,範例被分配在"LOH(Large Object Heap)堆"。
在.NET Framework中,所有派生於System.Object的就是參照型別,參照型別範例位於"堆"。參照型別包括:
public int Add(int x) { int result; result = x + 2; return result; }
1、在執行Add(int x)方法之前,方法引數x被存放到"棧"的頂部。
2、在"method table"中搜尋Add()方法,如果找不到,就讓JIT及時編譯再存放到"method table"中去。
3、開始執行Add(int x)方法,區域性變數result也需要"棧"中的一些記憶體。
4、當方法執行完畢,先釋放result,再釋放x,執行緒堆疊指標重新指向。
public class MyClass { public int MyValue; } public MyClass Add(int x) { MyClass result = new MyClass(); result.MyValue = x + 2; return result; }
1、在執行Add(int x)方法之前,方法引數x被存放到"棧"的頂部。
2、在"method table"中搜尋Add()方法,如果找不到,就讓JIT及時編譯再存放到"method table"中去。
3、開始執行Add(int x)方法,執行MyClass result = new MyClass()
先在託管堆上建立一個MyClass的範例,然後在棧上開闢一塊空間並指向範例地址。
4、當方法執行完畢,在棧中由上到下依次釋放記憶體。
此時,在託管堆上的MyClass範例如何處理呢?
5、此時,垃圾回收器登場了,他在託管堆中搜尋那些不再被參照的物件範例,然後實施回收。
public int ReturnValue() { int x = new int(); x = 3; int y = new int(); y = x; y = 4; return x; }
結果是:3, 因為值型別x變數,在方法執行結束之前,一直存在於棧上。
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的欄位值。
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對it145.com的支援。如果你想了解更多相關內容請檢視下面相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45