什么时候c#中的垃圾收集器退出

时间:2016-06-10 10:55:26

标签: c#

在整个Main方法执行完毕后垃圾收集器是否关闭,或者它是否仍然在后台运行以清理Main方法在内存中留下的所有对象。

3 个答案:

答案 0 :(得分:5)

垃圾收集器将在程序出口的后台运行以运行挂起的终结器,但如果终结器耗时太长,它将过早放弃并退出。

您可以使用以下程序演示:

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();
        }
    }
}

在调试器下运行该程序,您将看到在GC放弃之前,实际只运行了20个终结器中的一些。

但是,您可以通过调用

确保所有挂起的终结器在程序结束时完全运行
GC.Collect();
GC.WaitForPendingFinalizers()

如果您取消注释上面示例代码中Main()末尾的三个已注释掉的行并再次在调试器下运行该程序,您将看到所有20个调用{{1终结者将被制作。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

GC由.net框架本身产生。