一般的建议是你不应该GC.Collect从你的代码中调用,但是这条规则的例外是什么?
GC.Collect
我只能想到一些非常具体的情况,强制垃圾收集可能是有意义的。
一个浮现在脑海中的例子是一项服务,它每隔一段时间就会醒来,执行一些任务,然后长时间休眠。在这种情况下,强制收集以防止即将空闲的进程占用比需要更多的内存可能是一个好主意。
还有其他可以打电话的情况GC.Collect吗?
如果您有充分的理由相信一组重要的对象(尤其是您怀疑属于第 1 代和第 2 代的对象)现在有资格进行垃圾回收,那么就性能损失而言,现在是进行垃圾回收的合适时机.
一个很好的例子是,如果您刚刚关闭了一个大表单。您知道所有的 UI 控件现在都可以被垃圾回收,并且在表单关闭时很短的暂停可能不会被用户注意到。
更新 2.7.2018
从 .NET 4.5 开始 - 有GCLatencyMode.LowLatency和GCLatencyMode.SustainedLowLatency. 进入和离开这两种模式时,建议您使用GC.Collect(2, GCCollectionMode.Forced).
GCLatencyMode.LowLatency
GCLatencyMode.SustainedLowLatency
GC.Collect(2, GCCollectionMode.Forced)
从 .NET 4.6 开始 - 有GC.TryStartNoGCRegion方法(用于设置只读值GCLatencyMode.NoGCRegion)。这本身可以执行完全阻塞垃圾回收以尝试释放足够的内存,但鉴于我们在一段时间内不允许 GC,我认为在前后执行完全 GC 也是一个好主意。
GC.TryStartNoGCRegion
GCLatencyMode.NoGCRegion
资料来源:Microsoft 工程师 Ben Watson 的: 编写高性能 .NET 代码 ,第 2 版。2018 年。
看: