后台垃圾回收

在后台垃圾回收 (GC) 中,在进行第 2 代回收的过程中,将会根据需要收集暂时代(第 0 代和第 1 代)。 后台垃圾回收是在一个或多个专用线程上执行的,具体取决于它是工作站还是服务器 GC,它只适用于第 2 代回收。

默认情况下启用后台垃圾回收。 可以使用 .NET Framework 应用中的 gcConcurrent 配置设置或 .NET Core 和 .NET 5 及更高版本中 的 System.GC.Concurrent 设置启用或禁用它。

注释

后台垃圾回收取代 了并发垃圾回收 ,在 .NET Framework 4 及更高版本中可用。 在 .NET Framework 4 中,仅支持 工作站 垃圾回收。 从 .NET Framework 4.5 开始,后台垃圾回收可用于 工作站服务器 垃圾回收。

后台垃圾回收期间对暂时代的回收称为“前台”垃圾回收。 发生前台垃圾回收时,所有托管线程都将被挂起。

当后台垃圾回收正在进行并且已在第 0 代中分配了足够的对象时,CLR 将执行第 0 代或第 1 代前台垃圾回收。 专用的后台垃圾回收线程将在常见的安全点上进行检查以确定是否存在对前台垃圾回收的请求。 如果存在,则后台回收将挂起自身以便前台垃圾回收可以发生。 前台垃圾回收完成后,专用后台垃圾回收线程和用户线程将恢复。

后台垃圾回收消除了并发垃圾回收施加的分配限制,因为临时垃圾回收可能在后台垃圾回收期间发生。 后台垃圾回收可以删除暂存世代中的死对象。 如果需要,它还可以在第 1 代垃圾回收期间扩展堆。

后台工作站与服务器 GC

从 .NET Framework 4.5 开始,后台垃圾回收功能可用于服务器上的 GC。 后台 GC 是服务器垃圾回收的默认模式。

后台服务器垃圾回收功能与后台工作站垃圾回收类似,但存在一些差异:

  • 后台工作站垃圾回收使用一个专用后台垃圾回收线程,而后台服务器垃圾回收使用多个线程。 通常,每个逻辑处理器都有一个专用线程。

  • 与工作站后台垃圾回收线程不同,后台服务器 GC 线程不会超时。

下图显示对独立专用线程执行的后台工作站垃圾回收

后台工作站垃圾回收

下图显示对独立专用线程执行的后台服务器垃圾回收

后台服务器垃圾回收

并行垃圾回收

小窍门

本部分仅适用于:

  • 用于工作站垃圾回收的 .NET Framework 3.5 及更早版本
  • 用于服务器垃圾回收的 .NET Framework 4 及更早版本

在更高的版本中,后台垃圾回收取代了并行垃圾回收。

在工作站或服务器垃圾回收中,可以 启用并发垃圾回收,这样线程就可以与一个专用线程同时运行,该线程在回收的大部分持续时间内执行垃圾回收。 此选项仅影响第 2 代中的垃圾回收;第 0 代和第 1 代始终是非并发的,因为它们完成得很快。

并发垃圾回收通过最大限度减少垃圾回收时的暂停,使交互式应用程序响应更迅速。 托管线程可以在并发垃圾回收线程运行时继续运行大部分时间。 此设计导致垃圾回收发生时暂停时间较短。

并发垃圾回收在一个专用线程上执行。 默认情况下,CLR 在单处理器和多处理器计算机上运行工作站垃圾回收,同时启用并发垃圾回收。

下图显示了在单独的专用线程上执行的并发垃圾回收。

并发垃圾回收线程

另请参阅