如何减少垃圾收集性能开销

时间:2010-07-16 17:57:50

标签: c# performance garbage-collection

我的应用程序分析显示了大量的垃圾收集开销。分析器没有深入到垃圾收集。我该怎么做才能减少这种开销?

我有许多短命的arraylists和一些长寿的,只有在应用程序关闭时才会死亡。

4 个答案:

答案 0 :(得分:7)

基本上你应该减少垃圾收集器的工作。有一些“模式”可以产生大量的工作。

  • 避免使用带终结器的许多物体。终结器对垃圾收集器施加了额外的工作,因为必须收集具有终结器的对象两次。
  • 避免“中年”危机。 .NET GC(在桌面上)是分代GC。当对象在第一个集合中存活,但不久之后“死亡”时,GC已经做了很多工作。 (应对第二代,再次收集等)。因此,尝试以非常快速地死亡或长时间存活的方式优化对象的生命周期。
  • 减少不必要的分配。例如,明智地使用值类型。或者以较少内存密集的方式完成工作。

所以在你的情况下,我猜你或者你有一个'中年'危机与短命的名单。或者你简单地分配像疯狂的列表。

在第一种情况下:尝试缩短列表的寿命。我无法告诉您应用程序的解决方案是什么样的。

在第二种情况下:尽量避免分配这么多列表。也许你可以使用正确的价值类型?还是固定大小的数组?或者以更少的列表需要更改代码的结构?

无论如何,我建议您了解一下您的应用情况,看看您分配的内存量以及第一代可以收集的内容。

答案 1 :(得分:5)

如果你有太多的垃圾收集开销,减少你的垃圾。尝试重用列表(预先分配并使用它们,完成后清除它们)。

如果您正在使用带有值类型的ArrayList,请尝试切换为使用List<T>代替。

答案 2 :(得分:1)

如果垃圾收集开销成为一个严重的性能问题,那么您必须查看您的设计并重新评估您正在创建的短期对象的数量。

答案 3 :(得分:0)

如果此应用程序作为服务运行,或者在返回用户界面之前执行大量工作,则可能需要更改垃圾收集模型。

如果没有其他细节,很难给出好的推荐。