Main方法的垃圾收集(无限循环)

时间:2016-08-17 19:31:37

标签: c# asp.net garbage-collection

我正在实现一个无限的任务,它经常通过.net控制台应用程序运行。但是我担心下面会导致内存泄漏。由于Main是静态的(这是我对垃圾收集的知识变得模糊的地方)是不是意味着我在try和catch中创建的对象在Main完成之前不会被垃圾收集器拾取(永远不会)?

有人可以解释垃圾收集器在这种情况下的行为吗?

public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
         .MinimumLevel.Debug()
         .WriteTo.RollingFile("Logs/log-{Date}.txt")
         .CreateLogger();
        while (true)
        {
            try
            {
                Thread.Sleep(1000);
                new UpdatePlayer().Run();
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

  

因为Main是静态的(这是我对垃圾收集的知识变得模糊)并不意味着我在try和catch中创建的对象在Main完成之前不会被垃圾收集器拾取(这是从不)?

不,这是假的。

垃圾收集器能够释放无法再从托管代码访问的任何对象的内存。在这种情况下,很明显在Run方法结束后(除非您在其他地方存储对该对象的引用)该对象将不再可访问,因此允许GC释放它(可能需要一些时间这样做,但允许到。)

答案 1 :(得分:2)

您没有内存泄漏:Main p>

UpdatePlayer()

带有内存泄漏的示例

 ...
 try
 {
     Thread.Sleep(1000);

     // Instance created, executed
     new UpdatePlayer().Run();
 }

 // And can be safely collected here when the instance is out of scope (`try {...}`)
 // the anonymous instance can't be accessed and that's enough 

修改:如果您将集合移至 // please notice, that anchor is outside the `while(true)` scope List<Object> anchor = new List<Object>(); ... while (true) { try { Thread.Sleep(1000); // Instance created var item = new UpdatePlayer(); // anchored anchor.Add(item); // and executed item.Run(); } // item can't be collected here: anchor has a reference to it // And the item potentially can be accessed by, say, anchor[0] 范围,则代码将为而不会内存泄漏:

while(true)