在大多数情况下,垃圾回收器可以确定执行回收的最佳时间,并且应该让它独立运行。 可能在某些情况下,强制收集会提高应用程序性能,但这种情况很少见。 在这些情况下,可以使用 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) 方法重载,指定诱导回收是否是阻止式。 执行的集合类型取决于方法 mode
与 blocking
参数的组合。
mode
是 GCCollectionMode 枚举的成员,而 blocking
是一个 Boolean 值。 下表汇总了参数mode
和blocking
之间的交互。
mode |
blocking = true |
blocking = false |
---|---|---|
Forced 或 Default | 尽快执行阻塞回收。 如果后台回收正在进行且分代为 0 或 1,Collect(Int32, GCCollectionMode, Boolean) 方法会立即触发阻止式回收,并在回收完成后返回结果。 如果后台集合正在进行并且 generation 参数为 2,该方法将等待后台集合完成,触发阻止第 2 代集合,然后返回。 |
尽快执行回收。 Collect(Int32, GCCollectionMode, Boolean) 方法请求执行后台回收,但这并没有保证;阻止式回收仍可执行,具体视环境而定。 如果后台回收正在进行,该方法将立即返回。 |
Optimized | 可能会执行阻止式回收,具体视垃圾回收器的状态和 generation 参数而定。 垃圾回收器尝试提供最佳性能。 |
根据垃圾回收器的状态,有时可执行回收。 Collect(Int32, GCCollectionMode, Boolean) 方法请求执行后台回收,但这并没有保证;阻止式回收仍可执行,具体视环境而定。 垃圾回收器尝试提供最佳性能。 如果后台回收正在进行,该方法将立即返回。 |