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

And*_*ins 130 c#

采访者今天问我这件事......有答案吗?

Tal*_*ner 178

建议不要明确调用gc,但是如果你打电话

GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

这将显式调用GC整个代码,不要忘记调用GC.WaitForPendingFinalizers();GC.Collect().

  • `WaitForPendingFinalizers`并不一定能提供"更好的性能":它只是阻塞,直到最终化队列中的所有对象都已完成(可能是你之前调用`Collect`的对象).如果你想要有机会收集这些对象,那么在调用`WaitForPendingFinalizers`之后你需要*另一个*调用`Collect`*. (14认同)
  • 由于调用gc.Collect的几个很好的理由之一是释放未正确处理的资源的最后努力,WaitForPendingFinalizers似乎是必要的一步.但是,不确定最好的做法是避免在这种情况下过度调用gc.Collect.顺便说一句,我想知道gc.Collect'有'促进世代的技术原因是什么?除非有足够的东西分配给一代以证明推进它的合理性,否则让几代人留下来似乎更有用. (2认同)
  • _注意C#中的初学者_(像我一样):GC强制调用不保证,从内存中删除一些具体的未使用对象.(一种方法是使用"using statement"(https://msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx))) (2认同)
  • 为什么调用 `WaitForPendingFinalizers` 应该很重要? (2认同)

Kar*_*nam 173

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

  • 为什么不推荐? (15认同)
  • GC.Collect()运行起来很昂贵。不建议做多余的事情。何时调用的代码写得很好。通常,您仅应在特殊情况下自行收集。/sf/answers/1537324421/ (3认同)

Sri*_*thy 18

GC.Collect() 
Run Code Online (Sandbox Code Playgroud)

来自MDSN,

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

所有对象,无论它们在记忆中存在多长时间,都被考虑收集; 但是,不会收集托管代码中引用的对象.使用此方法强制系统尝试回收最大可用内存量.


Jus*_*ner 12

GC.Collect();

但请记住,垃圾收集器可能并不总是清理您期望的内容......

  • 你是什​​么意思?它有什么意外的清洁? (5认同)
  • @Voldemort - 它不会意外地清理任何东西.但它可能无法清理您期望的所有内容. (4认同)

the*_*oop 6

您不希望强制垃圾收集器运行.

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

GC.Collect()
Run Code Online (Sandbox Code Playgroud)

  • 寻找内存泄漏时很好。 (3认同)
  • 我更喜欢@Karthik的答案,在某些情况下,应用程序应合法调用GC.Collect()。虽然很少。 (2认同)
  • 假设您有一系列弱引用,并想检查是否存在任何“实时”引用。在检查之前调用GC.Collect()是有意义的。只是说。 (2认同)
  • 因开场白事实上不正确而被否决;是的,我确实想强制垃圾收集器运行。 (2认同)

小智 5

我认为 .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();
Run Code Online (Sandbox Code Playgroud)

我想就是这样..希望我能帮助别人。