c#中的垃圾收集器何时退出
垃圾收集器是在整个主方法完成执行后关闭,还是仍在后台运行以清理主方法在内存中留下的所有对象。一旦进程终止,属于它的所有资源都将被释放。这是由操作系统执行的。GC用于托管资源 我猜在这种情况下,main是入口点方法,例如在控制台应用程序中。垃圾收集器(GC)将随应用程序启动并退出。 在应用生命周期内,它在后台运行以释放托管资源c#中的垃圾收集器何时退出,c#,C#,垃圾收集器是在整个主方法完成执行后关闭,还是仍在后台运行以清理主方法在内存中留下的所有对象。一旦进程终止,属于它的所有资源都将被释放。这是由操作系统执行的。GC用于托管资源 我猜在这种情况下,main是入口点方法,例如在控制台应用程序中。垃圾收集器(GC)将随应用程序启动并退出。 在应用生命周期内,它在后台运行以释放托管资源 GC是由.net framework本身产生的。垃圾收集器将在程序退出时在后台运行,以运行挂起的终结器,但如果终结器花费的时间太长,它将放弃并过早退出 您可以使用以下程序演
GC是由.net framework本身产生的。垃圾收集器将在程序退出时在后台运行,以运行挂起的终结器,但如果终结器花费的时间太长,它将放弃并过早退出 您可以使用以下程序演示这一点:
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();
}
}
}
如果您取消注释上面示例代码中
Main()
末尾的三个注释掉的行,并在调试器下再次运行该程序,您将看到对Test
finalizer的所有20个调用都将被执行。finalizer仍然需要在Main退出后运行,因此,在所有用户代码完成执行后不久,GC/框架就会终止。有一个技术性的、正确的答案是很有意思的。应用程序通常在主方法(以及程序的入口点)完成时终止。此时,GC可能会运行一段时间,但最终,操作系统将清除所有分配的内存。垃圾收集器在单独的线程中运行,因此即使返回Main
,垃圾收集器也可以继续运行。关于C#可执行文件的Main方法,Main几乎总是入口点,即使你有表格。
GC.Collect();
GC.WaitForPendingFinalizers()