如何强制垃圾收集器运行?

时间:2010-11-23 15:02:46

标签: c#

采访者今天问我这个问题......有答案吗?

9 个答案:

答案 0 :(得分:168)

建议不要明确调用gc,但如果调用

GC.Collect();
GC.WaitForPendingFinalizers();

它会在您的代码中明确调用GC,不要忘记在GC.WaitForPendingFinalizers();之后调用GC.Collect()

答案 1 :(得分:160)

System.GC.Collect()强制垃圾收集器运行。建议不要这样做,但如果出现这种情况,可以使用。

答案 2 :(得分:17)

GC.Collect() 

来自MDSN

  

使用此方法尝试回收所有   无法访问的内存。

     

所有对象,无论多长时间   他们一直在记忆中   考虑收集;然而,   托管中引用的对象   代码未收集。用这个   迫使系统尝试的方法   收回最高金额   可用内存。

答案 3 :(得分:11)

答案 4 :(得分:10)

GC.Collect();

但请记住,垃圾收集器可能无法始终清理您期望的内容......

答案 5 :(得分:6)

您不想强制垃圾收集器运行。

然而,如果你曾经做过(当然是纯粹的学术练习):

GC.Collect()

答案 6 :(得分:4)

我认为.Net Framework会自动执行此操作,以防万一。 首先,确保选择要擦除的内容,然后调用垃圾收集器:

randomClass object1 = new randomClass
...
...
// Give a null value to the code you want to delete
object1 = null;
// Then call the garbage collector to erase what you gave the null value
GC.Collect();

我认为是这样的......希望我帮助别人。

答案 7 :(得分:1)

由于我的声誉太低无法发表评论,因此我将其作为答案发布,因为它在经过数小时的努力后拯救了我,并且可能对其他人有所帮助:

正如大多数人所说的 GC.Collect();不建议正常执行此操作,除非在极端情况下。作为这个正在运行的垃圾收集的示例,正​​是我的方案的解决方案。

我的程序在线程中对文件运行长时间运行的操作,然后从主线程中删除该文件。但是:当文件操作抛出异常时,.NET 不会释放文件锁,直到垃圾被实际收集,即使长时间运行的任务被封装在 using 语句中。因此,程序必须在尝试删除文件之前强制进行垃圾回收。

在代码中:

        var returnvalue = 0;
        using (var t = Task.Run(() => TheTask(args, returnvalue)))
        {
            //TheTask() opens a file and then throws an exception. The exception itself is handled within the task so it does return a result (the errorcode)
            returnvalue = t.Result;
        }
        //Even though at this point the Thread is closed the file is not released untill garbage is collected
        System.GC.Collect();
        DeleteLockedFile();

答案 8 :(得分:0)

GC.Collect()

您可以运行来照顾非托管对象,但是如果您的对象是GC第1代,那么对您来说不会成功。