什么是“根源参考”?

引用来自( 安全在C#不是在C + +中,指针/引用的简单返回,答案3)由Eric lippert。

此外,请注意,它不是任何引用,保持活着的人对象。 参考必须根植。 你可以有两个相互引用的Person对象,否则无法访问; 每个人都有参考的事实并不能使他们活着; 其中一个参考必须根植。

我不明白,有人可以解释什么是根源的参考?

这意味着一个GC根。

阅读这篇文章 ,也许这将有助于你的理解:

GC根本身不是对象,而是对象的引用。 由GC根引用的任何对象都将自动在下一次垃圾回收中存活。 .NET中有四种主要的根:

当前正在运行的方法中的局部variables被认为是GC根。 这些variables所引用的对象总是可以通过它们声明的方法立即被访问,所以它们必须被保留。 这些根源的寿命可以取决于程序的build立方式。 在debugging版本中,只要方法在堆栈上,局部variables就会持续。 在发布版本中,JIT能够查看程序结构以找出执行过程中的最后一点,即方法可以使用variables,并在不再需要时放弃该variables。 这种策略并不总是被使用,可以closures,例如,通过在debugging器中运行程序。

静态variables也总是被视为GC根。 它们引用的对象可以随时由声明它们的类来访问(或者如果它们是公共的,那么程序的其余部分),所以.NET将一直存在。 声明为“线程静态”的variables只会在线程运行时才会持续。

如果托pipe对象通过互操作传递给非托pipeCOM +库 ,则它也将成为具有引用计数的GC根。 这是因为COM +不会执行垃圾回收:它使用引用计数系统; 一旦COM +库通过将参考计数设置为0就结束了该对象,它就不再是GC根并且可以被再次收集。

如果一个对象有一个终结器 ,当垃圾回收器决定它不再是“活的”时,它不会立即被删除。 相反,它直到.NET调用终结器方法才成为一种特殊的根。 这意味着这些对象通常需要将多于一个的垃圾回收从内存中移除,因为它们将在第一次被发现未被使用时存活下来。

(重点是我的)

有各种各样的根对象,如CLR内部对象,元数据对象等。这篇文章可能有所帮助 :

variables和GC根

  • 值types的variables是直接表示值types实例在堆栈上的地址
  • 值types实例的引用variables称为托pipe指针,并且是指向堆栈上值types实例起始地址的指针
  • 引用types(UDT,数组,string,委托和接口typesvariables)的variables是指向在GC堆上创build的引用types实例的指针
  • CPU寄存器可以包含托pipe指针或对象引用
  • AppDomain wide句柄表包含GC句柄,这些句柄是指向内存中固定的引用types实例的指针。 这些句柄表还包含对静态值types实例的pipe理指针(或对象引用?)和对静态引用types实例的对象引用
  • 线程本地存储(TLS)可以包含对象引用
  • FReachable Queue包含引用types的对象引用,这些引用types不被任何上述variablestypes引用,并且finalize方法调用处于挂起状态

CLR的垃圾收集器使用上述variables(也称为GC根)在垃圾收集阶段跟踪对象引用。 位于GC堆中的任何引用types实例(对于其中没有任何上述variablestypes中的对象引用(FReachable队列除外))被视为垃圾回收的候选者,并从GC堆中删除。 如果被移除的引用types实例实现了Finalize方法,那么对象引用被放在可访问队列上,以通过单独的终结器线程调用Finalize方法。 一旦Finalizer线程完成对象引用的Finalize方法调用,相应的Reference Type实例就从GC堆中移除。