今天,我在CodeProject上阅读了一篇关于内存管理.NET的博客。
网址 - Article
它说 -
退出方法(乐趣):现在最终执行控制开始 退出方法。当它通过结束控制时,它会清除所有 在堆栈上分配的内存变量。换句话说就是全部 与int数据类型相关的变量在中取消分配 堆叠中的'LIFO'时尚。
最大的收获 - 它没有取消分配堆内存。这个记忆 稍后将被垃圾收集器取消分配。
根据我的理解,垃圾收集器只取消分配堆内存。那么,谁将取消分配堆栈内存?
请建议。
答案 0 :(得分:1)
即使没有垃圾收集,堆栈中的值也可以自动管理,因为每次您输入/退出范围(方法或语句)时,都以LIFO方式从堆栈中添加和删除项目,这正是变量的原因在for循环内定义,或者if语句在该范围外不可用。
用完堆栈上的所有可用空间后,您将收到一个StackOverflowException,尽管几乎可以肯定,这是无限循环(错误!)或设计不完善的系统(涉及近乎无穷递归调用)的征兆。
答案 1 :(得分:0)
简而言之:
堆栈存储器未被释放。这是一块可以重复使用的内存块。每次范围声明变量(推入堆栈)时,它将在范围退出时弹出。
因此,当调用方法时,参数(值或引用指针)被(复制)推送到堆栈并从中弹出,当方法结束。 (弹出只是调整指针(索引)与内存)
这就是为什么{ }
中声明的变量在de }
这个内存块是每个线程。
答案 2 :(得分:0)
在.NET中,变量位于堆栈中,无论它是否包含数字(值类型),结构(完全位于堆栈上)或引用object(即对象的托管地址,对象本身位于堆上)。
此外,人们有时会将变量与类字段混淆。字段和所有类成员位于堆上,在实例化对象时分配的区域内。
因此,没有任何变量的分配或解除分配,因为它们只是超出范围的值。变量超出范围后,GC无法到达实际(堆)对象并最终收集它。