2016-06-10 75 views
1

整个Main方法执行完毕后垃圾收集器是否会关闭,还是仍在后台运行,以清除Main方法留在内存中的所有对象。c#中的垃圾回收器什么时候退出

+1

终止程序仍然需要在main退出后运行,所以它在所有用户代码完成GC/framework终止执行后的某个地方。对此有一个技术性的,正确的答案会很有趣。 – MicroVirus

+0

当Main方法(以及程序的入口点)完成时,该应用程序通常会终止。此时,GC可能会运行一段时间,但最终操作系统会清除所有分配的内存。 – poke

+0

垃圾回收器运行在一个独立的线程*中,所以即使返回Main也可以继续运行 –

回答

4

垃圾收集器将在程序出口的后台运行,以运行挂起的终结器,但是如果终结器需要太长时间,它会放弃并提前退出。

你可以用下面的程序演示了此:在调试器下

using System; 
using System.Diagnostics; 
using System.Threading; 

namespace Demo 
{ 
    class Test 
    { 
     ~Test() 
     { 
      Thread.Sleep(250); 
      Trace.WriteLine("In Test finalizer"); 
     } 
    } 

    class Program 
    { 
     static void Main() 
     { 
      var t = new Test[20]; 

      for (int i = 0; i < 20; ++i) 
       t[i] = new Test(); 

      //t = null; 
      //GC.Collect(); 
      //GC.WaitForPendingFinalizers(); 
     } 
    } 
} 

运行该程序,你会看到只有一些20个终结的实际运行前的GC放弃。

但是,可以确保通过调用

GC.Collect(); 
GC.WaitForPendingFinalizers() 

所有未决终结在节目的结尾完全运行。如果您取消注释在Main()末三注释掉线在上面的示例代码并再次在调试器下运行该程序,您将看到所有20个调用Test终结器的调用都将生成。

0

一旦进程终止,属于它的所有资源都将被释放。这由操作系统执行。 GC用于托管资源。

我猜main是这种情况下的入口点方法,例如在控制台应用程序中。

+0

对于C#可执行文件,即使有表单,main也几乎总是入口点。 – MicroVirus

0

垃圾回收器(GC)已随您的应用程序启动,并将随其退出。 在您的应用生命周期中,它会在后台运行以释放托管资源。

GC由.net框架本身产生。

+0

关于Main方法的垃圾回收器呢 – deshmanth