[英]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.