繁体   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