被动回收

在大多数情况下,垃圾回收器可以确定执行回收的最佳时间,并且应该让它独立运行。 可能在某些情况下,强制收集会提高应用程序性能,但这种情况很少见。 在这些情况下,可以使用 GC.Collect 方法来启动垃圾回收。

GC.Collect当在应用程序代码的特定点使用内存量显著减少时,请使用此方法。 例如,如果应用程序使用具有多个控件的复杂对话框,则当对话框关闭时调用 Collect 可能会通过立即回收对话框使用的内存来提高性能。 请确保应用程序不会过于频繁地诱发垃圾回收,因为如果垃圾回收器尝试在非最佳时间回收对象,则这可以降低性能。 可以向GCCollectionMode.Optimized方法提供Collect枚举值,以便仅在收集是有效时才进行收集,具体见下一节所述。

GC 回收模式

可以使用包含 GC.Collect 值的 GCCollectionMode 方法重载之一,指定强制回收的行为,如下所示。

GCCollectionMode DESCRIPTION
Default 对于运行版本的 .NET 使用默认垃圾回收设置。
Forced 强制立即进行垃圾回收。 这相当于调用 GC.Collect() 重载。 它会导致对所有分代进行完全阻塞回收。

还可以通过在强制立即完全阻止垃圾回收之前将 GCSettings.LargeObjectHeapCompactionMode 属性设置为 GCLargeObjectHeapCompactionMode.CompactOnce 压缩大型对象堆。
Optimized 使垃圾回收器能够确定当前时间是否最适合回收对象。

垃圾回收器可能会判断一次回收的成效不足以证明其合理性,在这种情况下,它将不进行对象回收而结束。

后台回收或阻塞回收

可以调用 GC.Collect(Int32, GCCollectionMode, Boolean) 方法重载,指定诱导回收是否是阻止式。 执行的集合类型取决于方法 modeblocking 参数的组合。 modeGCCollectionMode 枚举的成员,而 blocking 是一个 Boolean 值。 下表汇总了参数modeblocking之间的交互。

mode blocking = true blocking = false
ForcedDefault 尽快执行阻塞回收。 如果后台回收正在进行且分代为 0 或 1,Collect(Int32, GCCollectionMode, Boolean) 方法会立即触发阻止式回收,并在回收完成后返回结果。 如果后台集合正在进行并且 generation 参数为 2,该方法将等待后台集合完成,触发阻止第 2 代集合,然后返回。 尽快执行回收。 Collect(Int32, GCCollectionMode, Boolean) 方法请求执行后台回收,但这并没有保证;阻止式回收仍可执行,具体视环境而定。 如果后台回收正在进行,该方法将立即返回。
Optimized 可能会执行阻止式回收,具体视垃圾回收器的状态和 generation 参数而定。 垃圾回收器尝试提供最佳性能。 根据垃圾回收器的状态,有时可执行回收。 Collect(Int32, GCCollectionMode, Boolean) 方法请求执行后台回收,但这并没有保证;阻止式回收仍可执行,具体视环境而定。 垃圾回收器尝试提供最佳性能。 如果后台回收正在进行,该方法将立即返回。

另请参阅