C#中的并发,后台和服务器垃圾收集有何不同?

时间:2018-02-04 12:21:12

标签: c# garbage-collection

我知道配置设置<gcConcurrent>,但我读过的文档和文章都提到了具有单独线程和并发性的后台垃圾收集。该文档还讨论了服务器模式下的多个线程。有人可以澄清这些差异吗?我想了解更改<gcConcurrent&gt;的结果。在配置中设置以及如何适应也可能更改设置<gcServer>

1 个答案:

答案 0 :(得分:1)

后台GC

  

从.NET Framework 4开始,并发垃圾回收被后台垃圾回收取代。术语并发和后台在.NET Framework文档中可互换使用。 MS Docs

所以我们可以说后台 GC使用专用线程来与您的应用程序的线程一起垃圾收集并发(即并行)。此并发集合仅发生在第2代(0和1很快)。

工作站GC

这是默认设置,在单处理器环境中强制使用。

后台GC始终处于启用状态。

服务器GC

GC将为每个逻辑处理器创建一个垃圾收集线程,并为每个逻辑处理器创建单独的对象堆(您的代码将不知道这一点),这允许更快的并行/并发GC。

您可以在.config文件中启用服务器GC:

<configuration>
  <runtime>
    <gcServer enabled="true"/>
  </runtime>
</configuration>

后台GC默认启用,但可以在配置中禁用:

…
<gcConcurrent enabled="false"/>
…

是的,启用后台GC以及服务器模式将导致每个逻辑处理器仅2个线程用于GC,但这不是一个大问题,因为它们在GC操作之外保持挂起状态。