C#垃圾回收器何时退出?

3

垃圾收集器是在整个Main方法执行结束后关闭,还是仍在后台运行以清理Main方法在内存中留下的所有对象。


1
终结器在主函数退出后仍需要运行,因此在所有用户代码执行完毕之后不久,垃圾回收/框架终止。有一个技术上正确的答案会很有趣。 - MicroVirus
应用程序通常在Main方法完成(因此是程序的入口点)时终止。此时,GC可能运行一段时间,但最终操作系统会清除所有分配的内存。 - poke
垃圾回收器在一个独立的线程中运行,因此即使Main返回,它也可以正常进行。 - Dmitry Bychenko
3个回答

8
垃圾回收器将在程序退出时后台运行以运行待处理的终结器,但如果终结器运行时间过长,它将放弃并过早退出。
您可以使用以下程序演示此过程:
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()结尾处的三行注释并再次在调试器下运行程序,您将会看到对Test终结器的20个调用。

0

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

我猜测在控制台应用程序中,main 是入口方法。


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

0
垃圾回收(GC)会随着您的应用程序启动并关闭。 在您的应用程序生命周期中,它将在后台运行以释放托管资源。
GC是由.NET框架本身创建的。

关于 Main 方法和垃圾收集器,有何看法? - deshmanth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接