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

bso*_*aid 5 c# performance garbage-collection

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

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

Gam*_*lor 7

基本上你应该减少垃圾收集器的工作.有一些'模式'产生了很多工作.

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

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

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

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

无论如何,我建议你介绍一下你的应用程序,看看你分配了多少内存以及第一代可以收集多少内存.


µBi*_*Bio 5

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

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

  • 他们的算法肯定存在其他问题,即使我为实验编写了垃圾代码,我也不必担心GC. (2认同)