【问题标题】:How Garbage collector Will behave on value type and Reference type垃圾收集器如何处理值类型和引用类型
【发布时间】:2012-12-26 09:30:49
【问题描述】:

垃圾收集器在释放内存值类型和引用类型时如何处理值类型和引用类型。我对此有点困惑,任何人都可以解释一下,同时垃圾收集器删除释放值类型或引用类型的内存,首先删除

【问题讨论】:

  • 我相信你问的是垃圾收集器(GC),而不是全局程序集缓存(GAC)
  • 好像你搞砸了 GAC(全局程序集缓存)和 GC(垃圾收集器)
  • 请看来自利珀特先生的this answer
  • 我明白你的意思,但如果两者都存在,那么 gc 将首先删除哪一个..

标签: c# asp.net


【解决方案1】:

您以错误的方式思考问题。停止思考“值类型”和“引用类型”。相反,开始考虑变量,以及这些变量是短命还是长命

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

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

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

【讨论】:

    【解决方案2】:

    垃圾收集器只关心引用类型。它不会对值类型做任何事情。

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

    【讨论】:

    • 盒装值类型呢?它们不是被垃圾收集器清理了吗?
    • @EricLippert 啊,好吧,点了。我在考虑 ECMA-335 规范中的模型,其中“对于每个值类型,CTS 定义了一个相应的引用类型,称为盒装类型”(第 I.8.2.4 节),所以我包括了“盒装值types”作为“引用类型”的子集。我意识到这与 C# 类型系统中对值和引用类型的处理并不完全相同,但失眠使我无法弄清楚这一点。感谢您关注它。
    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多