垃圾收集器将如何对值类型和引用类型执行操作

时间:2012-12-26 09:30:49

标签: c# asp.net

垃圾收集器在值类型和引用类型上的行为方式,它将释放内存值类型和引用类型。我有点困惑,这可以任何人解释这一点,同时垃圾收集器删除免费的内存值的类型或参考类型哪个删除第一

2 个答案:

答案 0 :(得分:20)

你正在以错误的方式思考这个问题。不要再考虑“价值类型”和“参考类型”了。相反,开始考虑变量,以及这些变量是短暂的还是长寿

垃圾收集堆的目的是回收与长期存在的变量相关联的存储。 堆栈的目的是回收与short-associated相关的存储。生活变量。

人们会试着告诉你“值类型在堆栈上”和“引用在堆上”等等,这是令人困惑的废话。 变量进入堆栈或堆(或寄存器 - 每个人都忘记了寄存器),变量可以是值类型或引用类型。

你一直在问“垃圾收集器首先要删除哪个?”这个问题无法回答。垃圾收集堆不保证回收内存的顺序。当激活帧从堆栈中弹出时,将回收短期存储 - 堆栈。 但是,如果运行时可以确定将不再访问该引用,则C#语言允许垃圾收集器清除由帧中弹出的短存储引用的存储。基本上,当回收存储时是运行时的实现细节,随时可能发生变化

答案 1 :(得分:2)

垃圾收集器只关注引用类型。它对值类型没有任何作用。

值类型可能存在于堆栈中,在这种情况下,当方法退出并调整堆栈指针时,将回收它们的内存。值类型也可以作为引用类型的字段存在于堆中。在这种情况下,当GC收集引用类型对象时,将回收内存。