我正在实现一个无限的任务,它经常通过.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());
}
}
}
答案 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)