服务器GC是Web服务默认选择,.NET运行时自动启用;工作站GC仅适用于单用户桌面应用。可通过GCSettings.IsServerGC或性能计数器验证,配置优先级为环境变量>csproj>自动检测。
ASP.NET Core 或传统 ASP.NET 应用在 IIS 或 Kestrel 上运行时,默认启用的是 server GC,不是 workstation GC。这个决定由运行时自动判断——只要检测到多核 CPU 和非交互式环境(比如 Windows Server 或 Linux 容器),.NET 运行时就会启用服务器 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 个堆。
常见误判点:
true ,结果没生效——因为 .NET 6+ 默认按运行环境自动选型,显式配置只在项目文件中有效且需重启进程绝大多数 Web 服务不需要改,但如果你在低配 VM(如 1 vCPU)上跑高吞吐 API,或做 GC 行为对比测试,才考虑显式控制。修改方式是在 .csproj 文件的 里加:
true
注意:
true = 服务器 GC(推荐 Web 服务);false = 工作站 GC(适合 WinForms/WPF)DOTNET_gcServer,它会覆盖 csproj 配置(优先级:环境变量 > csproj > 自动检测)ENV DOTNET_gcServer=true 而不是改 csproj,避免镜像复用时配置僵化服务器 GC 不是“更快的 GC”,而是“为吞吐和并发设计的 GC”:
concurrent GC,后台线程独立工作)GC.Collect() 的“紧急回收”语义——调用它只会触发本线程所在堆的 GC,其他堆不受影响GCSettings.LatencyMode(如 GCLatencyMode.LowLatency)对服务器 GC 效果有限,仅短暂抑制后台 GC,不能替代正确对象生命周期管理真正容易被忽略的是:服务器 GC 下的 Gen2 回收成本极高,如果频繁分配大对象(>85KB),会直接进 LOH,而 LOH 在服务器 GC 中不压缩(除非 .NET 5+ 开启 gcServer + gcConcurrent 并配合 GCSettings.LargeObjectHeapCompactionMode 显式触发),长期运行后容易出现 OutOfMemoryException —— 这不是 GC 类型选错了,是对象尺寸或复用策略有问题。
# linux
# js
# json
# docker
# windows
# iis
# 环境变量
# win
# 区别
# c#
# 内存占用
# .net
# 堆
# 线程
# 并发
# 对象
# wpf
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Windows执行文件被SmartScreen拦截原因_安全提示与绕过方式
c++中的std::conjunction和std::disjunction是什么_c++模板元编程逻辑运算【C++17】
如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法
php下载安装后swoole扩展怎么安装_异步框架支持【汇总】
如何使用Golang实现路由分组管理_Golang路由分组与权限控制方法
Python多线程使用规范_线程安全解析【教程】
Mac怎么开启“任何来源”_Mac安装未签名应用的设置方法【解决】
如何在 Go 中创建包含映射(map)的切片(slice)结构
c++协程和线程的区别 c++异步编程模型对比【核心】
VSC怎么创建PHP项目_从零开始搭建项目的步骤【操作】
Win11如何设置文件权限 Win11 NTFS文件夹所有权与安全设置【高级】
C++中的std::shared_from_this有什么用?C++安全获取this的shared_ptr【智能指针】
Win11怎么设置默认输入法 Win11固定中文输入法【步骤】
如何使用Golang实现文件加密_Golang crypto 文件加密示例
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Win11怎么设置开机自动连接宽带_Windows11创建拨号连接计划任务
获取 PHP 文件最后修改时间的正确方法
Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】
mac怎么安装adb_MAC配置Android ADB开发环境【详解】
Win11怎么开启专注模式_Windows11时钟应用Focus Session
Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】
PHP主流架构怎么处理表单验证_规则与自定义【技巧】
Windows蓝屏BAD_POOL_HEADER故障详解_蓝屏池损坏错误修复指南
如何在Golang中实现RPC异步返回_Golang RPC异步处理与回调方法
Win11怎么关闭用户账户控制UAC_Windows11更改通知设置等级
c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】
Mac如何备份到iCloud_Mac桌面与文稿文件夹云同步【设置】
php修改数据怎么批量改状态_批量更新status字段值技巧【操作】
Windows10如何更改桌面图标间距_Win10注册表WindowMetrics修改
php查询数据怎么导出csv_查询结果转csv文件保存【操作】
php高频调试功能有哪些_php常用调试函数与工具汇总【解答】
Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】
MySQL 中使用 IF 和 CASE 实现查询字段的条件映射
如何在 Go 中正确初始化结构体中的 map 字段
c++ unordered_map怎么用 c++哈希表用法【教程】
c++中如何进行二进制文件读写_c++ read与write函数用法
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
LINUX怎么设置系统语言_LINUX修改中文环境
Win11怎么更改计算机名_Windows11系统信息重命名设备教程
如何在 Go 结构体中正确初始化 map 字段
如何使用Golang捕获并记录协程panic_保证主程序稳定运行
短链接怎么用php还原_从基础原理到代码实现教学【详解】
Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度
Win11怎么设置多显示器任务栏 Win11扩展任务栏至多屏方便跨屏操作【技巧】
Windows资源管理器总是卡顿或重启怎么办?(修复方法)
Windows10蓝屏代码DPC_WATCHDOG_VIOLATION_Win10死机修复指南
如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法
MAC怎么解压RAR格式文件_MAC第三方解压工具安装与压缩包管理【教程】
Win11怎么关闭系统提示音_Windows11声音方案设为无声教程
Python 中将 ISO 8601 时间戳转换为日期并计算日期差值的完整教程
2026-01-02
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。