这些收集会影响性能。我猜测这可能是由于GC预算(针对Gen2?)。是否有办法设置此预算(直接或间接),以使我的服务器在开始时表现更佳?
我看到了一组反直觉的结果:我们大幅减少了内存(和大对象堆)分配量,长期性能得到了改善,但早期性能变差,并且“稳定下来”的时间更长。
GC显然需要一定的时间才能意识到我们的应用程序是一个内存占用量很大的程序,并相应地进行调整。我已经知道这个事实,如何说服GC呢?
编辑:
操作系统:64位Windows Server 2008 R2
我们使用.Net 4.0 ServerGC Batch Latency。尝试了4.5和3种不同的延迟模式,虽然平均性能略有提高,但最差情况的性能实际上恶化了。
编辑2:
GC峰值可以将时间(我们说秒)从可接受到不可接受的时间翻倍
几乎所有峰值都与Gen 2收集相关
我的测试运行导致最终的32GB堆大小。初始的泡沫期持续了前1/5的运行时间,在那之后的性能实际上更好(峰值不太频繁),即使堆正在增长。测试结束时的最后一个峰值(具有最大的堆大小)与初始“训练”期间的2个峰值(堆要小得多)相同高度(即一样糟糕)。
byte[1024]
数组,一直保持它们被分配,直到所有它们都被分配。然后你将它们释放并开始正常启动。这可能会扩大垃圾回收的预算。但我认为这是可怕的 hack。 - usr