在整个Main方法执行完毕后垃圾收集器是否关闭,或者它是否仍然在后台运行以清理Main方法在内存中留下的所有对象。
答案 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框架本身产生。