面试官今天问我这个...有答案吗?
System.GC.Collect()
强制垃圾收集器运行。不建议这样做,但可以在出现情况时使用。
不建议显式调用 gc,但如果调用
GC.Collect();
GC.WaitForPendingFinalizers();
它将在您的代码中显式调用 GC,不要忘记在 GC.Collect()
之后调用 GC.WaitForPendingFinalizers();
。
WaitForPendingFinalizers
不一定提供“更好的性能”:它只是阻塞,直到完成队列中的所有对象都已完成(您之前调用 Collect
时可能已将这些对象放在那里)。如果您希望有机会收集这些对象,则需要 另一个 调用 Collect
调用 WaitForPendingFinalizers
。
WaitForPendingFinalizers
很重要?
GC.Collect()
从MDSN,
使用此方法尝试回收所有不可访问的内存。所有对象,无论它们在内存中存在多长时间,都会被考虑收集;但是,不会收集托管代码中引用的对象。使用此方法强制系统尝试回收最大数量的可用内存。
但请记住,垃圾收集器可能并不总是清理您所期望的......
您不想强制垃圾收集器运行。
但是,如果你曾经做过(当然,作为纯粹的学术练习):
GC.Collect()
我认为 .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();
我想就是这样..希望我能帮助别人。
由于我的声誉太低而无法发表评论,因此我将其发布为答案,因为它在经过数小时的挣扎后拯救了我,并且可能对其他人有所帮助:
正如大多数人所说 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();
这是一个替代建议。保持服务器 GC 的启用状态。然后根据用户定义的设置强制 GC 在应用程序内存超过您确定为关键级别的某个阈值时运行。
请注意,如果您遵循这条路径,您实际上是在说明您对 CLR 应该在何时运行垃圾收集有更好的了解。大多数情况下,我发现 CLR 自己做的工作比我们干涉它时做得更好。
用于检查内存使用情况并跨所有代或指定代运行 GC 的代码
long UsedMemory;
//UsedMemory = GC.GetTotalMemory(false); // Not as reliable
UsedMemory = System.Diagnostics.Process.GetCurrentProcess().PagedMemorySize64;
if (UsedMemory > 1073741824) // One GB in bytes 1 X 1024 X 1024 X 1024
{
GC.Collect(); // Collect all generations
//GC.Collect(2,GCCollectionMode.Forced);; Or collect a specific generation and force it to run now
}
不定期副业成功案例分享