相关疑难解决方法(0)

触发gen2垃圾收集的原因是什么?

我有一个奇怪的情况,我想弄明白.

创世纪:

我在具有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(或完整)集合呢?相当多的这些gen2集合(成千上万)正在发生.即如何确定启动gen2集合的阈值?
  • 为什么垃圾收集器不会简单地延迟任何完整的收集,直到物理RAM上的压力达到更高的阈值?
  • 有什么办法可以配置垃圾收集器等待更高的阈值吗?(即如果没有必要,根本不打扰收集)

编辑:

我已经在使用服务器垃圾收集器的选项...我需要知道的是什么是触发gen2集合,而不是服务器垃圾收集器更好(我已经知道).

.net garbage-collection memory-management c#-4.0

21
推荐指数
2
解决办法
6653
查看次数

.NET 4 GC已知阈值可触发收集?

我知道GC触发的逻辑并不简单,但它有一定的监控阈值.

任何人都知道.NET 4工作站和服务器GC的这些阈值是多少?

谢谢

.net garbage-collection .net-4.0 clr4.0

5
推荐指数
1
解决办法
893
查看次数