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

35

我已经将一个ASP.NET Core项目升级到了VS2017和新的csproj格式,现在有这个选项:

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

什么是服务器垃圾回收?没有适当的文档,只有一个迁移指南,假定您已经知道它是什么。
(除非有正式文档,否则请告诉我。)
总结:遗憾的是,很多底层技术的文档中没有详细的内容。 然而@PanagiotisKanavos的链接在此处提供了关键部分有关“服务器GC”的信息。

你试过谷歌搜索吗?有很多文档,可以追溯到几年前。这对于.NET Core来说并不新鲜,即使该属性有一个新名称。 - Panagiotis Kanavos
1
可能和这个链接(https://msdn.microsoft.com/zh-cn/library/ms229357(v=vs.110).aspx)一样吗? - Mats391
1
然后你会看到第一个结果是垃圾回收基础,它解释了工作站和服务器垃圾回收之间的区别。这在.NET Core中没有改变。 - Panagiotis Kanavos
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速度的限制。

1
虽然这个答案是正确的(符合典型的推理),但我想指出存在一些情况,你需要在工作站模式下运行应用程序,而不是服务器模式(非常罕见,只有当服务器模式给你带来可怜的崩溃时)。当然,如果您愿意,您应该向Microsoft支持报告此类崩溃,以便他们可以改进GC。 - Lex Li
问题字面上询问了 ASP.NET 垃圾回收策略是什么。 答案应该是:Server GC。框架在此处执行 https://github.com/dotnet/sdk/blob/be3ef1ebb2a627978f5fb613977feac3535a221c/src/WebSdk/ProjectSystem/Targets/Microsoft.NET.Sdk.Web.ProjectSystem.props#L20。 - Serge Pavlov
@SergePavlov 实际上它是 .NET Core。而且你提供的只是一个配置文件,而且没有解释它的作用。具体实现细节将取决于运行你的 MSIL 的框架 - 因此我给出了最一般的概述,以使他理解选择(可能)意味着什么。 - Christopher
@Christopher ASP.NET Core:是的。我无法给出解释,因为没有解释。框架会按照默认设置使用服务器 GC。你的回答很好也很有教育意义。 - Serge Pavlov

9

MSDN文档...

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

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

对于单处理器计算机,默认的工作站垃圾回收应该是最快的选项。对于双处理器计算机,可以使用工作站或服务器。对于超过两个处理器的计算机,服务器垃圾回收应该是最快的选项。

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


3
这就是我在上面评论中所说的意思。这段描述并没有真正解释什么是“服务器垃圾收集”。只是说有这样一种东西,在服务器上发生,也有其他选项,并且在哪种硬件上使用它。但这是什么呢??? - grokky
@Luaan 这只是一个简单的误解(我认为)。OP假设在.NET Core中GC不同,因此绕过了所有未明确提到.NET Core中服务器GC的文档和参考资料。鉴于它并不不同,因此没有这样的文档。进退两难。 - Panagiotis Kanavos
@Luaan 不,我正在寻找一个理性问题的理性答案,就像其他人非常友善地提供帮助一样。 - grokky
2
@PanagiotisKanavos,其中有一节解释了优缺点和好处。你本可以一开始就把这个作为答案添加进去,避免所有的不愉快。尽管如此,还是感谢你提供链接。 - grokky
@PanagiotisKanavos 啊哈,那就是误解了...我还以为你只是在逗乐呢。哈哈。是的,我没有找到相关的文档,所以那个链接很有帮助,再次感谢。 - grokky
显示剩余5条评论

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
这些设置使我的应用程序无响应并消耗大量内存。我必须在我的ASP.NET Core 3.1应用程序中将其关闭,然后应用程序才能开始正常工作。 - Kamran Shahid

2

它可以在服务器(多个处理器)和工作站(一个处理器)之间切换垃圾回收。


要明确的是,“处理器”实际上是“CPU核心”(实际上是CPU线程,我想)。因此,这不像“NUMA中的多CPU是一种东西”,而是像“所有在2005年之后制造的计算机”中的多CPU。 - jspinella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接