整个Main方法执行完毕后垃圾收集器是否会关闭,还是仍在后台运行,以清除Main方法留在内存中的所有对象。c#中的垃圾回收器什么时候退出
回答
垃圾收集器将在程序出口的后台运行,以运行挂起的终结器,但是如果终结器需要太长时间,它会放弃并提前退出。
你可以用下面的程序演示了此:在调试器下
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
终结器的调用都将生成。
一旦进程终止,属于它的所有资源都将被释放。这由操作系统执行。 GC用于托管资源。
我猜main是这种情况下的入口点方法,例如在控制台应用程序中。
对于C#可执行文件,即使有表单,main也几乎总是入口点。 – MicroVirus
垃圾回收器(GC)已随您的应用程序启动,并将随其退出。 在您的应用生命周期中,它会在后台运行以释放托管资源。
GC由.net框架本身产生。
关于Main方法的垃圾回收器呢 – deshmanth
- 1. 什么时候在java中使用垃圾回收器?
- 2. 什么时候动作<T>得到垃圾回收?
- 3. 什么时候对象引用会被垃圾回收?
- 4. C#垃圾回收
- 5. C#定时器和垃圾回收
- 6. 程序退出后,C/C++中的对象是否会收集垃圾回收?
- 7. 什么时候在Python中收集对象垃圾?
- 8. .NET垃圾回收器什么时候会释放这个对象?
- 9. nodejs垃圾回收输出
- 10. Objective-c和垃圾回收
- 11. 垃圾回收 - 期待什么?
- 12. Python + Numpy:什么时候手动收集垃圾有用?
- 13. 嘘,垃圾回收器
- 14. Java垃圾回收器
- 15. .net垃圾回收器何时运行?
- 16. Perl中的垃圾回收
- 17. Java EE:servlet容器中的垃圾回收
- 18. java中垃圾回收器的逻辑
- 19. Android 2.3中的垃圾回收器
- 20. Kubernetes中的容器垃圾回收
- 21. JDBC垃圾回收
- 22. Java:垃圾回收
- 23. Java:垃圾回收
- 24. Erlang垃圾回收
- 25. java垃圾回收
- 26. Python垃圾回收
- 27. JS垃圾回收
- 28. Javascript垃圾回收
- 29. PhoneGap垃圾回收
- 30. java - 垃圾回收
终止程序仍然需要在main退出后运行,所以它在所有用户代码完成GC/framework终止执行后的某个地方。对此有一个技术性的,正确的答案会很有趣。 – MicroVirus
当Main方法(以及程序的入口点)完成时,该应用程序通常会终止。此时,GC可能会运行一段时间,但最终操作系统会清除所有分配的内存。 – poke
垃圾回收器运行在一个独立的线程*中,所以即使返回Main也可以继续运行 –