C# 垃圾收集器从哪里开始?

C# 垃圾收集器从哪里开始?,c#,garbage-collection,C#,Garbage Collection,从我读到的内容来看,在GC运行扫描之前,GC从“根”开始,跟踪并标记所有活动对象。但我不确定是什么构成了根。例如,在下面的代码中,Main方法从一个线程开始并存在。那么当GC启动时,它如何知道选择哪个部分作为根呢 static void Main() { var thread = new Thread(SomeLongRunningProcess); thread.Start(); }

从我读到的内容来看,在GC运行扫描之前,GC从“根”开始,跟踪并标记所有活动对象。但我不确定是什么构成了根。例如,在下面的代码中,Main方法从一个线程开始并存在。那么当GC启动时,它如何知道选择哪个部分作为根呢

         static void Main()
         {

             var thread = new Thread(SomeLongRunningProcess);
             thread.Start();

         }

        static void SomeLongRunningProcess()
        {


        }
根包括

  • 静态字段(对于流程中的每个AppDomain,加载的所有程序集中所有类型的所有静态字段)
  • 局部变量(包括CPU寄存器中每个线程的变量)
  • f-可达队列(具有终结器的对象列表)
  • 终结队列(对象列表,否则为垃圾,但等待终结)

如果你能解释一下你试图解决的潜在问题,那就真的很有帮助了,比如:你为什么想知道?这几乎解释了你需要知道的关于GC的一切。“垃圾收集算法”部分与你的问题相关。谷歌上有很多关于这个主题的资料,就像这样。几乎这里问的任何问题都会在msdn中找到答案:)。关键是你能在合理的时间内得到一个简单问题的答案吗?我已经给出了一段简单的代码,有了透彻理解的人能够在比我阅读那篇文章所需的3个小时要短得多的时间内给出准确的答案。很好,对StackOverflow的否决意味着“没有显示任何研究成果”。我没有看到哪个对象的静态变量?如果该类从未被调用过呢?2>入口点方法中的局部变量?3> 我不确定具有终结器的对象列表是否构成根。它可能最终是一个活动对象,但不一定是根。我将更明确地说明静态字段,但我不理解您对局部变量的要求。每个堆栈上的所有局部变量一存在即为根,并在不再存在之前保持根。f-可达队列肯定是根。它引用的所有对象在最终确定之前都不能被垃圾收集。@Foo您似乎对只有一个根感到困惑。没有。有许多对象符合根对象的条件。