垃圾收集器在释放内存值类型和引用类型时将如何处理值类型和引用类型。我对此有点困惑,任何人都可以解释一下,同时垃圾收集器删除释放值类型或引用类型的内存首先删除
问问题
6406 次
2 回答
26
你以错误的方式思考问题。停止思考“值类型”和“引用类型”。相反,开始考虑变量,以及这些变量是短期的还是长期的。
垃圾收集堆的目的是回收与长期变量相关的存储。堆栈 的目的是回收与短期变量相关的存储。
人们会试图告诉您“值类型在堆栈上”和“引用在堆上”等等,这是令人困惑的废话。 变量在堆栈或堆上(或寄存器——每个人都忘记了寄存器),变量可以是值类型或引用类型。
你一直在问“垃圾收集器会先删除哪个?” 这个问题无法回答。垃圾收集堆不保证回收内存的顺序。当激活帧从堆栈中弹出时,短期存储——堆栈——将被回收。但是,如果运行时可以确定不会再次访问引用,则 C# 语言允许垃圾收集器在将帧从堆栈弹出之前清理由短期存储引用的存储。基本上,何时回收存储是运行时的一个实现细节,随时可能发生变化。
于 2012-12-26T17:10:33.043 回答
2
垃圾收集器只关心引用类型。它不会对值类型做任何事情。
值类型可能存在于堆栈中,在这种情况下,当方法退出并调整堆栈指针时,它们的内存会被回收。值类型也可以作为引用类型的字段存在于堆中。在这种情况下,当 GC 收集引用类型的对象时,将回收内存。
于 2012-12-26T10:29:49.967 回答