通八洲科技

c# 服务器GC和工作站GC的区别和设置

日期:2026-01-02 00:00 / 作者:煙雲
服务器GC是Web服务默认选择,.NET运行时自动启用;工作站GC仅适用于单用户桌面应用。可通过GCSettings.IsServerGC或性能计数器验证,配置优先级为环境变量>csproj>自动检测。

工作站GC适合单用户桌面应用,服务器GC才是Web服务的默认选择

ASP.NET Core 或传统 ASP.NET 应用在 IIS 或 Kestrel 上运行时,默认启用的是 server GC,不是 workstation GC。这个决定由运行时自动判断——只要检测到多核 CPU 和非交互式环境(比如 Windows Server 或 Linux 容器),.NET 运行时就会启用服务器 GC。你手动改错配置,反而可能让 GC 压力更大、暂停更长。

如何确认当前用的是哪种 GC 模式

最直接的方式是查 System.Runtime.GCSettings.IsServerGC 的返回值:

Console.WriteLine($"IsServerGC: {System.Runtime.GCSettings.IsServerGC}");

也可以通过性能计数器验证(Windows):.NET CLR Memory\# of Heaps 在服务器 GC 下通常是 CPU 核心数的 2 倍(每个线程池线程对应一个 GC 线程 + 后台 GC 线程),而工作站 GC 固定为 1 个堆。

常见误判点:

在 csproj 中强制设置 GC 模式(仅限需要干预时)

绝大多数 Web 服务不需要改,但如果你在低配 VM(如 1 vCPU)上跑高吞吐 API,或做 GC 行为对比测试,才考虑显式控制。修改方式是在 .csproj 文件的 里加:


  true

注意:

服务器GC的关键行为差异和实际影响

服务器 GC 不是“更快的 GC”,而是“为吞吐和并发设计的 GC”:

真正容易被忽略的是:服务器 GC 下的 Gen2 回收成本极高,如果频繁分配大对象(>85KB),会直接进 LOH,而 LOH 在服务器 GC 中不压缩(除非 .NET 5+ 开启 gcServer + gcConcurrent 并配合 GCSettings.LargeObjectHeapCompactionMode 显式触发),长期运行后容易出现 OutOfMemoryException —— 这不是 GC 类型选错了,是对象尺寸或复用策略有问题。