ASP.NET Core 中的服务器垃圾回收是什么?

What is server garbage collection in ASP.NET Core?

我已经将一个 ASP.NET 核心项目升级到 VS2017 和新的 csproj,并且有这个选项:

<PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>

什么是服务器垃圾回收?没有适当的文档,只有一个 migration guide,假定您已经知道它是什么。

(除非有正式的文档,在这种情况下请告诉我。)


总结:不幸的是,文档中没有很多底层技术的详细信息。但是@PanagiotisKanavos 的 link 有关于 "server gc" here.

的重要一点

msdn 文档...

https://msdn.microsoft.com/en-us/library/ms229357(v=vs.110).aspx

The common language runtime (CLR) supports two types of garbage collection: workstation garbage collection, which is available on all systems, and server garbage collection, which is available on multiprocessor systems. You use the element to control the type of garbage collection the CLR performs. Use the GCSettings.IsServerGC property to determine if server garbage collection is enabled.

For single-processor computers, the default workstation garbage collection should be the fastest option. Either workstation or server can be used for two-processor computers. Server garbage collection should be the fastest option for more than two processors.

This element can be used only in the application configuration file; it is ignored if it is in the machine configuration file.

migrating over 时,ServerGarbageCollection 映射自 System.GC.Server

<PropertyGroup>
  <ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>

What is server garbage collection?

简单来说就是一个配置值,指示.net运行时执行server garbage collection. Historically this was managed by the project.json。它enables/disables 服务器垃圾回收。

这是您将要找到的最接近官方文档的文件,它是关于在 project.json.

中添加此选项的公告

https://github.com/aspnet/Announcements/issues/175

同样,此处还有其他详细信息:

https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/clr-configuration-knobs.md#host-configuration-knobs

这似乎是普通(工作站)和并发(服务器)垃圾收集策略之间的区别。基本上,Workstation 方法 运行 解决了许多极端情况下的问题。大规模多线程场景(如 ASP 网络服务器)是这种极端情况的主要例子:

https://social.msdn.microsoft.com/Forums/en-US/286d8c7f-87ca-46b9-9608-2b559d7dc79f/garbage-collection-pros-and-limits?forum=csharpgeneral

请注意,并发 GC 存在弱引用和碎片整理等自然问题,但我不知道这是否适用于 .NET Core 实现。 .NET Core 团队可以对代码进行各种改进,这进入了设计 GC 内存管理器的领域。

也许它只定义了标记部分将使用多少并发线程(工作站默认为 1)。它还可能包括一些修改后的内存分配策略,以避免碎片整理等问题。 在任何一种情况下,实际收集本质上都必须 运行 单线程,停止所有托管线程,并将受内存速度限制,而不是 CPU 速度。

它在服务器(超过 1 个处理器)或工作站(1 个处理器)之间切换 GC。