不寻常的垃圾收集模式

Sim*_*ker 10 c# clr performance garbage-collection

我在.net 4.0下看到一些不寻常的垃圾收集模式,我无法解释,任何建议都会受到赞赏.

在我的程序运行的不同时间,G2收集计数开始增加,GC%时间接近100%.这会在停止前持续一段时间(请参阅下面的性能监视器屏幕抓取).在此期间,CLR GC ETW事件的PerfView跟踪显示许多长时间运行的G2集合正在以"AllocSmall"的原因背靠背触发.

任何人都可以了解一下:

  1. 绝对是导致'AllocSmall'事件的原因
  2. 为什么这些直接触发G2集合
  3. 为什么这些G2系列背靠背发生

LowMemory似乎不是问题,因为GC启动事件不会将其作为原因代码(http://msdn.microsoft.com/en-us/library/ff356162.aspx).我们也看到了类似的情况,其中G0集合背靠背发生.

编辑:有人建议触发器可能超出某个阈值.鉴于仍有可用的内存,我希望G2堆在这一点上扩展,而不是让GC捶打试图收集.

编辑:下面发布的图片分辨率远高于StackOverflow显示 - 只需在浏览器选项卡中直接打开图片链接即可.

性能监视器跟踪 PerfView事件跟踪

Abd*_*uda 3

垃圾收集发生的原因:

  1. 系统物理内存不足。

  2. 托管堆上分配的对象使用的内存超过了可接受的阈值。这意味着托管堆上已超出可接受的内存使用阈值。该阈值随着进程的运行而不断调整。

  3. 调用 GC.Collect 方法。在几乎所有情况下,您不必调用此方法,因为垃圾收集器连续运行。此方法主要用于特殊情况和测试。

看起来#2 就是这种情况,也就是说你已经“超越了可接受的阈值”。微软的模糊性+1。