事实:
- 我的应用程序托管在IIS8(Windows Server 2012)中
- .Net版本是4.6.1,因此使用的GC风味是后台服务器
- 第2代堆大小(在应用提供流量后15分钟)为12gb(非常合理,因为我们的应用包含大量数据)。
- 投放流量六天后:
- “第二代堆大小”计数器为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呢?
谢谢