簡體   English   中英

.NET中堆棧內存的取消分配

[英]De-Allocation of the Stack memory in .NET

今天,我在CodeProject上閱讀了有關內存管理.NET的博客。

網址- 文章

它說 -

退出方法(很有趣):現在,最終執行控制開始退出方法。 通過結束控制后,它將清除在堆棧上分配的所有內存變量。 換句話說,所有與int數據類型相關的變量都以“ LIFO”方式從堆棧中取消分配。

最大的收獲–它沒有取消分配堆內存。 稍后,垃圾收集器將重新分配此內存。

根據我的理解,垃圾收集器只會取消分配堆內存。 那么,誰將取消分配堆棧內存?

請提出建議。

即使沒有垃圾回收,堆棧中的值也可以自動管理,因為每次您輸入/退出范圍(方法或語句)時,都會以LIFO方式從堆棧中添加和刪除項目,這正是為什么在變量中定義變量的原因。 for循環或if語句在該范圍之外不可用。

用盡堆棧上的所有可用空間后,您將收到一個StackOverflowException,盡管幾乎可以肯定是無限循環(錯誤!)或設計不完善的系統(涉及近乎無限的遞歸調用)的症狀。

簡而言之:

堆棧內存未釋放。 這是一塊將被重用的內存。 每次作用域聲明變量(推送到堆棧上)時,在退出作用域時都會彈出該變量。

因此,在調用方法時,方法結束時,將參數(值或參考指針)壓入(復制)到堆棧上並從堆棧中彈出。 (彈出只是調整內存的指針(索引))

這就是為什么{ }中聲明的變量在de }之后不可用的原因

這塊內存是每個線程的。

在.NET中, 變量位於堆棧上,而不管它是否持有數字(值類型),結構(完全位於堆棧上)或對對象的引用(即對象的托管地址),對象本身在堆上的位置)。

同樣,人們有時會將變量與類字段混淆。 字段和所有類成員位於堆上,在實例化對象時分配的區域內。

因此,沒有任何變量的分配或取消分配,因為它們只是超出范圍的值。 變量超出范圍后,GC無法到達實際(堆)對象,並且最終將其收集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM