我有一个奇怪的情况需要解决。
起因:
我在一台物理机器上运行程序,该机器有16个核心和128GB的RAM。我试图确定为什么它没有使用所有可用的核心,通常平均使用20-25%的CPU(即16个核心中的4-5个)。当我查看性能计数器时,它们显示大约60-70%的时间在垃圾收集中。
作为参考,我正在使用.NET Framework 4和TPL(Parallel.ForEach)来线程化我的程序的性能密集部分。我将线程数限制为核心数。
问题:
我正在创建大量对象,远远超过垃圾收集器能够有效处理的数量,因此它花费了大量时间在垃圾收集器中。
到目前为止的简单解决方案:
我正在引入对象池以减轻垃圾收集器的压力。我将继续对对象进行池化以改善性能,已经对一些对象进行了池化,将垃圾收集从60-70%的时间降至45%的时间,并且我的程序运行速度提高了40%。
令人不满的问题(希望您能为我回答):
运行时,我的程序最多使用14GB可用RAM,相对于128GB的RAM来说很小。除此之外,没有其他东西在这台机器上运行(它纯粹是我的测试平台),而且有足够的RAM可用。
- 如果有足够的RAM可用,为什么还会出现任何gen2(或full)集合?许多这些gen2集合(数千个)正在发生。也就是说,它如何确定开始进行gen2集合的阈值?
- 为什么垃圾收集器不会简单地延迟任何完整的收集,直到物理RAM的压力达到更高的阈值?
- 有没有办法配置垃圾收集器等待更高的阈值?(即,如果不需要,则根本不进行收集)
编辑:
我已经使用了使用服务器垃圾收集器的选项... 我需要知道的是是什么触发了gen2收集,而不是服务器垃圾收集器更好(我已经知道了)。