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

gro*_*kky 24 .net c# csproj .net-core asp.net-core

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

<PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

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


简介:遗憾的是,很多基础技术的文档中没有详细信息.然而,@ PanagiotisKanavos的链接在这里有关于"服务器gc"的重要信息.

Chr*_*her 14

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

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速度.


小智 7

msdn文档......

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

公共语言运行库(CLR)支持两种类型的垃圾收集:工作站垃圾收集(可在所有系统上使用)和服务器垃圾收集(可在多处理器系统上使用).您可以使用该元素来控制CLR执行的垃圾回收类型.使用GCSettings.IsServerGC属性确定是否启用了服务器垃圾回收.对于单处理器计算机,默认工作站垃圾回收应该是最快的选择.工作站或服务器都可用于双处理器计算机.服务器垃圾收集应该是两个以上处理器的最快选择.该元素只能在应用程序配置文件中使用; 如果它在机器配置文件中,则忽略它.

  • 这就是我在上面的评论中的含义.这个描述实际上并没有解释什么是"服务器垃圾收集".只有存在这样的事情,它发生在服务器上,还有其他选项,以及你应该使用它的硬件.但它是什么??? (2认同)
  • @PanagiotisKanavos 那里有一个部分解释了优点/缺点,好东西。您可以一开始就添加一个答案,并避免所有讨厌的事情。尽管如此,还是感谢您的链接。 (2认同)

Dav*_*ine 5

进行迁移的,在ServerGarbageCollection从地图System.GC.Server.

<PropertyGroup>
  <ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

什么是服务器垃圾收集?

简单地说,它是一个配置值,指示.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

  • 我不同意"指示服务器执行垃圾收集".无论如何都会发生垃圾收集,但Workstation和Server垃圾收集之间存在差异.此属性仅在工作站("false")和服务器("true")GC之间切换. (5认同)
  • 此设置使我的应用程序无响应并消耗 GB 内存。我必须在我的 asp.net core 3.1 应用程序中将其关闭,然后应用程序开始工作 (2认同)