工作站和服务器垃圾回收

垃圾回收器可自行优化并且适用于多种方案。 不过,你可以基于工作负载的特征设置垃圾回收的类型。 CLR 提供了以下类型的垃圾回收:

  • 工作站垃圾回收 (GC) 是为客户端应用设计的。 它是独立应用的默认 GC 风格。 对于托管应用(例如由 ASP.NET 托管的应用),由主机确定默认 GC 风格。

    工作站垃圾回收既可以是并发的,也可以是非并发的。 并发(或后台 )垃圾回收使托管线程能够在垃圾回收期间继续操作。 后台垃圾回收替换 .NET Framework 4 及更高版本中的并行垃圾回收

  • 服务器垃圾回收,用于需要高吞吐量和可伸缩性的服务器应用程序。

    • 在 .NET Core 中,服务器垃圾回收既可以是非并发也可以是后台执行。

    • 在 .NET Framework 4.5 和更高版本中,服务器垃圾回收既可以是非并发也可以是后台执行。 在 .NET Framework 4 和以前的版本中,服务器垃圾回收非并行运行。

下图演示了服务器上执行垃圾回收的专用线程:

Server Garbage Collection Threads

性能注意事项

工作站 GC

以下是工作站垃圾回收的线程处理和性能注意事项:

  • 回收发生在触发垃圾回收的用户线程上,并保留相同优先级。 因为用户线程通常以普通优先级运行,所以垃圾回收器(在普通优先级线程上运行)必须与其他线程竞争 CPU 时间。 (运行本机代码的线程不会由于服务器或工作站垃圾回收而挂起。)

  • 工作站垃圾回收始终用于只有一个逻辑 CPU 的计算机,无论配置设置如何。

服务器 GC

以下是服务器垃圾回收的线程处理和性能注意事项:

  • 回收发生在多个专用线程上。 在 Windows 上,这些线程以 THREAD_PRIORITY_HIGHEST 优先级运行。

  • 为每个逻辑 CPU 提供一个用于执行垃圾回收的一个堆和专用线程,并将同时回收这些堆。 每个堆都包含一个小对象堆和一个大对象堆,并且所有的堆都可由用户代码访问。 不同堆上的对象可以相互引用。

  • 因为多个垃圾回收线程一起工作,所以对于相同大小的堆,服务器垃圾回收比工作站垃圾回收更快一些。

  • 服务器垃圾回收通常具有更大的段。 但是,这是通常情况:段大小特定于实现且可能更改。 调整应用程序时,不要假设垃圾回收器分配的段大小。

  • 服务器垃圾回收会占用大量资源。 例如,假设在一台有 4 个逻辑 CPU 的计算机上,运行着 12 个使用服务器 GC 的进程。 如果所有进程碰巧同时回收垃圾,它们会相互干扰,因为将在同一个逻辑 CPU 上调度 12 个线程。 如果进程处于活动状态,则最好不要让它们都使用服务器 GC。

如果运行应用程序的数百个实例,请考虑使用工作站垃圾回收并禁用并发垃圾回收。 这可以减少上下文切换,从而提高性能。

请参阅