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

问题描述 投票:0回答:4

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

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

什么是服务器垃圾回收?没有适当的文档,只有一个迁移指南,假设您已经知道它是什么。

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


总结:不幸的是,文档中没有大部分底层技术的详细信息。然而@PanagiotisKanavos 的链接有关于“server gc”的重要信息here

c# .net asp.net-core .net-core csproj
4个回答
21
投票

这似乎是普通(工作站)和并发(服务器)垃圾收集策略之间的区别。基本上,工作站方法在许多极端情况下都会遇到问题。大规模多线程场景(如 ASP Web 服务器)就是这种极端情况的主要示例:

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 速度的限制。


9
投票

Microsoft Learn 文档...

https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcserver-element

公共语言运行时 (CLR) 支持两种类型的垃圾收集:工作站垃圾收集(适用于所有系统)和服务器垃圾收集(适用于多处理器系统)。使用 gcServer 元素来控制 CLR 执行的垃圾收集类型。使用 GCSettings.IsServerGC 属性来确定是否启用服务器垃圾收集。

对于单处理器计算机,默认的工作站垃圾收集应该是最快的选项。工作站或服务器均可用于双处理器计算机。对于两个以上处理器来说,服务器垃圾收集应该是最快的选择。最常见的是,当服务器应用程序的许多实例在同一台计算机上运行时,多处理器服务器系统会禁用服务器 GC 并使用工作站 GC。

该元素只能在应用程序配置文件中使用;如果它在机器配置文件中,则会被忽略。


6
投票

迁移到时,

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


2
投票
它在服务器(多于 1 个处理器)或工作站(1 个处理器)之间切换 GC。

© www.soinside.com 2019 - 2024. All rights reserved.