采访者今天问我这个问题......有答案吗?
答案 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)
但请记住,垃圾收集器可能无法始终清理您期望的内容......
答案 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代,那么对您来说不会成功。