不受欢迎的垃圾收集

Art*_*ius 7 .net c# garbage-collection

在Andrew Troelsen的书"C#2010和.NET 4平台"中写的"强制垃圾收集"标题中写道:

"同样,.NET垃圾收集器的全部目的是代表我们管理内存.但是,在一些非常罕见的情况下,使用GC.Collect()以编程方式强制垃圾收集可能是有益的.具体来说:

•您的应用程序即将进入一个您不希望被可能的垃圾回收中断的代码块......."

但是停下来!垃圾收集是不合需要的吗?我从来没有看过/读过这样的东西(因为我的开发经验很少).如果您在练习时已经做过类似的事情,请分享.对我来说这是非常有趣的一点.

谢谢!

Jon*_*eet 7

是的,绝对存在不希望垃圾收集的情况:当用户等待某事发生时,他们必须等待更长时间,因为在垃圾收集完成之前代码无法继续.

这是Troelsen的观点:如果你有,你知道一个GC的特定点是不存在问题,并可能能够收集显著大量垃圾,那么它可能是一个好主意,招惹它,然后,以避免它在一个不太触发适当的时机.


Mik*_*sen 5

我运行一个与食谱相关的网站,并在存储器中存储大量的食谱图表及其成分用量.由于我将这些信息转换为快速访问的方式,我必须在应用程序加载之前将几个数据库加载到内存中,然后才能将数据组织到一个非常优化的图形中.我在堆上创建了大量的小对象,一旦构建了图形,就会变得无法访问.

这一切都在Web应用程序加载时完成,可能需要4-5秒才能完成.在我这样做之后,我打电话GC.Collect();是因为我宁愿现在重新声明所有内存,而不是在传入的HTTP请求期间阻止所有线程,而垃圾收集器正在吓跑清理所有这些短暂的对象.我还认为现在最好清理,因为此时堆可能不那么碎片化,因为到目前为止我的应用程序还没有真正完成任何其他操作.延迟这种情况可能会导致创建更多对象,并且当GC自动运行时需要对堆进行更多压缩.

除此之外,在我12年的.NET编程中,我从未遇到过我想强制垃圾收集器运行的情况.