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


147

采访者今天问了我...有答案吗?


3
这个问题有关于为什么你不应该这样做虽好信息:stackoverflow.com/questions/118633/...
汉斯·奥尔森

1
您为什么这样说
安德鲁·柯林斯

1
@Jason-也许面试官不想听到解决方案,而是想了解安德鲁的知识和反对这样做的理由,那么这个问题可以说得通。
martinstoeckli 2012年

2
@martinstoeckli这仍然是一个可怕的问题。那些在紧张的面试中了解到这一点的人不会意识到这是一个棘手的问题,或者不会考虑提供其他信息。然后,该问题无助于面试官将有知识的人与没有知识的人区分开。所以这个问题仍然很可怕。
詹姆斯

2
“什么时候强制垃圾收集?” 听起来对我来说是一个很好的面试问题(“如何”:不多)。初学者:我不知道。中级:从不。专家:编写内存泄漏测试时。
mikebridge

Answers:



186

不建议显式调用gc,但如果调用

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

它将在整个代码中显式调用GC,请不要忘记在GC.WaitForPendingFinalizers();之后调用GC.Collect()


14
WaitForPendingFinalizers不一定能提供“更好的性能”:它只是阻塞,直到终结队列中的所有对象都被终结为止(这些对象可能是您先前对的调用所放置的对象Collect)。如果你想对那些有机会反对收集,那么你需要另一个调用Collect 调用WaitForPendingFinalizers
路加福音2010年

2
由于调用gc.Collect的几个很好的理由之一是为了释放没有适当处置的资源而进行的最后努力,因此WaitForPendingFinalizers似乎是必要的步骤。不过,不知道最好的做法是避免在这种情况下过度调用gc.Collect。顺便说一句,我想知道gc.Collect是否“具有”促进世代的技术原因?除非世代相传地分配了足够的东西来证明它是合理的,否则让世代留在这里似乎更有用。
超级猫

2
C#初学者(如我)的注意事项:GC强制调用不能保证,某些具体的未使用对象将从内存中删除。(要做到这一点的一个方法是使用“使用说明”(中msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx))
user1234567

为什么打电话很重要WaitForPendingFinalizers
基督教

19
GC.Collect() 

来自MDSN

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

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




6

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

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

GC.Collect()

4
我更喜欢@Karthik的答案,在某些情况下,应用程序应合法调用GC.Collect()。虽然很少。
Henk Holterman

2
假设您有一系列弱引用,并想检查是否存在“实时”引用。在检查之前调用GC.Collect()是有意义的。只是说。
Rich Ehmer 2014年

1
反对,因为开幕词实际上是不正确的;是的,我确实想强制垃圾收集器运行。
Syndog

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();

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.