.Net Gen2垃圾回收不会完全回收Gen 2堆

Sim*_*mon 5 .net c# garbage-collection memory-leaks

事实:

  1. 我的应用程序托管在IIS8(Windows Server 2012)中
  2. .Net版本是4.6.1,因此使用的GC风味是后台服务器
  3. 第2代堆大小(在应用提供流量后15分钟)为12gb(非常合理,因为我们的应用包含大量数据)。
  4. 投放流量六天后:
    • “第二代堆大小”计数器为17gb
    • “#Gen 2 collections”计数器为3600(这意味着每2.5分钟执行一次完整的gc周期,这对我们有好处)
    • 第二代平均收集时间约为300毫秒
    • 调用GC.Collect(2,GCCollectionMode.Forced)将Gen 2堆大小减小到12gb(使用API​​手动调用)
    • 诱导GC收集大约需要3秒钟(可能是因为它被阻止了,而不是背景)。

显然,在我们的应用程序中没有内存泄漏,因为诱导GC可以缩小堆大小。

似乎诱导的GC循环比常规的GC循环做更多的工作,但是找不到有关此的任何信息。

问题是:

为什么常规的第二代Gen2集合不将第二代Gen2的堆缩小到正常值,而诱导GC呢?

谢谢