一个人不应该直接调用垃圾收集器的原因

时间:2010-06-16 10:16:11

标签: .net garbage-collection

我正在为我的公司写一篇论文,关于如何避免直接从代码中调用垃圾收集器(例如,在玩COM对象时)。

我知道这是一种不好的做法,应该只在非常罕见的情况下考虑,但我似乎无法找到解释为什么应该避免的方法。而且我不想依赖“G.C.比你聪明”的原则(即使它是真理:-))

那么你能告诉我为什么你认为应该避免直接调用垃圾收集器的一些线索吗? (性能影响?)或者如果你有关于这个特定主题的链接,他们会非常有帮助。

提前致谢!

编辑:到目前为止,您提供的所有回声都非常有帮助。因为我无法验证每个人(或者我可以吗?),我该怎么办?制作社区维基?

4 个答案:

答案 0 :(得分:4)

主要原因是,花费在GC上执行完整集合所需时间超过必要时间的程序将比它需要的速度慢。

鉴于这是一种更容易获得更好性能的情况,对我来说似乎毫无疑问!

NB。使用COM对象时,直接调用GC不太可能解决您的问题。如果COM对象闲置,那么它们具有非零引用计数,并且没有额外的GC调用将修复它。

答案 1 :(得分:2)

通常的表现论证如下:

分代GC是快速的,因为它们依赖于启发式,许多分配的对象是短暂的(一个对象是“活的”,只要它是可达的; GC的要点是检测“死”对象并回收它们记忆)。这意味着物体可以在特殊区域(“年轻一代”)中积累; GC在该区域已满时运行,并清除活动对象,将它们(“物理上”)移动到旧一代。在大多数世代GC中,这种操作意味着暂停(“停止世界”)这是可以容忍的,因为它很短(年轻一代的尺寸有限)。在年轻一代的集合期间暂停世界这一事实允许有效处理年轻对象(即,在年轻对象字段中读取或写入引用仅仅是内存访问而无需考虑来自GC线程的并发访问或增量标记和扫描)。

如上所述,年轻一代的收藏品非常有效,因为收集年轻一代时,其中的大部分物品已经死亡,因此不会产生额外费用。年轻一代的最佳尺寸是在最坏情况(所有年轻物体都是现场,这意味着最大暂停时间)和平均效率之间的权衡(当年轻一代更大时,更多物体有时间死亡之前收集,降低了GC的平均成本。)

手动运行GC与使年轻一代更短。这意味着更多的年轻物体将被提升到老一代,从而增加了年轻一代的收集成本(必须清除更多的物品)老一代的收藏成本(要处理的旧对象。)

答案 2 :(得分:1)

它具有性能影响,因为需要停止所有线程才能执行收集。之后,它需要确定使用什么和不使用什么等等......

所有花费时间和垃圾收集器只有在确定收益大于伤害时才会起作用。

当你自己打电话给GC时,你很可能只是经常调用它,这会增加在GC中花费的时间并减少你在程序中花费的时间。

答案 3 :(得分:1)

如果你需要调用GarbageCollector以确保释放COM对象,那么这可能是一个好兆头,表明你的开发人员在他们没有调用Dispose和/或不使用using时应该。所以有一个论点可能就是隐藏坏代码而不是修复坏代码会更好。