我已经将一个ASP.NET Core项目升级到VS2017和新的csproj,并且有这个选项:
<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
什么是服务器垃圾回收?没有适当的文档,只有一个迁移指南,假设您已经知道它是什么。
(除非有正式文件,在这种情况下请告诉我。)
总结:不幸的是,文档中没有大部分底层技术的详细信息。然而@PanagiotisKanavos 的链接有关于“server gc”的重要信息here。
这似乎是普通(工作站)和并发(服务器)垃圾收集策略之间的区别。基本上,工作站方法在许多极端情况下都会遇到问题。大规模多线程场景(如 ASP Web 服务器)就是这种极端情况的主要示例:
请注意,并发 GC 存在弱引用和碎片整理等自然问题,但我不知道这是否适用于 .NET Core 实现。 .NET Core 团队可以对代码进行各种改进,这涉及到 GC 内存管理器的设计领域。
也许它只定义了标记部分将使用多少个并发线程(工作站默认为1)。它还可能包括一些修改后的内存分配策略,以避免碎片整理等问题。 无论哪种情况,实际的集合本质上都必须运行单线程,停止所有托管线程,并且将受到内存速度而不是 CPU 速度的限制。
Microsoft Learn 文档...
公共语言运行时 (CLR) 支持两种类型的垃圾收集:工作站垃圾收集(适用于所有系统)和服务器垃圾收集(适用于多处理器系统)。使用 gcServer 元素来控制 CLR 执行的垃圾收集类型。使用 GCSettings.IsServerGC 属性来确定是否启用服务器垃圾收集。
对于单处理器计算机,默认的工作站垃圾收集应该是最快的选项。工作站或服务器均可用于双处理器计算机。对于两个以上处理器来说,服务器垃圾收集应该是最快的选择。最常见的是,当服务器应用程序的许多实例在同一台计算机上运行时,多处理器服务器系统会禁用服务器 GC 并使用工作站 GC。
该元素只能在应用程序配置文件中使用;如果它在机器配置文件中,则会被忽略。
当迁移到时,
ServerGarbageCollection
从System.GC.Server
映射。
<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
什么是服务器垃圾回收?
简单来说,它是一个配置值,指示.net运行时执行服务器垃圾收集。从历史上看,这是由 project.json
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