0

0

c# .NET 的分代垃圾回收(Generational GC)如何影响并发应用

煙雲

煙雲

发布时间:2026-03-05 09:22:03

|

890人浏览过

|

来源于php中文网

原创

分代gc是.net运行时默认启用的强制机制,按对象生命周期分gen 0/1/2回收,gen 2停顿长易致响应延迟;需监控% time in gc>5%、gen 2 p95>15ms等指标及时干预。

c# .net 的分代垃圾回收(generational gc)如何影响并发应用

分代 GC 是什么,为什么 .NET 并发应用不能忽略它

分代垃圾回收不是“可选优化”,而是 .NET 运行时默认启用的强制行为——GC.Collect() 默认只触发 Gen 0 回收,而 Gen 1Gen 2 的回收成本高、停顿长,直接影响并发吞吐和响应延迟。你写的异步服务、高频率 API 或后台 Worker,只要对象生命周期不匹配代龄划分(比如短命对象意外滞留到 Gen 2),就会在某个请求里突然卡住几百毫秒。

Gen 0 频繁触发但影响小,Gen 2 却可能拖垮整个服务

Gen 0 回收快(通常 Gen 0 回收,就会被提升到 Gen 1,再活过一次就进 Gen 2。而 Gen 2 回收要遍历整个托管堆(包括大对象堆 LOH),且是**阻塞式全暂停(STW)**,哪怕只是 50MB 的 Gen 2 堆,也可能导致 20–100ms 的停顿——这对 HttpClient 池复用、SignalR 心跳或 gRPC streaming 来说就是超时源头。

  • 避免让短期对象升代:比如用 StringBuilder 拼接日志时反复 .Clear() 而非新建实例,防止内部缓冲区被提升
  • 大数组(≥85,000 字节)直接进 LOH,不参与 Gen 0/1 回收,且 LOH 只在 Gen 2 回收时整理(默认不压缩),容易碎片化 → 后续分配失败触发额外 Gen 2
  • ArrayPool<byte>.Shared.Rent(1024)</byte> 这类复用能显著减少 Gen 0 压力,但若租期过长(比如跨 await 边界未及时 Return),池内数组可能被提升到更高代

Concurrent GC 和 Server GC 的关键区别在哪

.NET 默认启用的是 Server GC(多线程并行回收),但它**不是完全并发的**:Gen 0/1 回收期间仍需 STW,只有 Gen 2 的标记阶段可与用户线程并发运行(即 Background GC)。是否启用 Background GC 取决于运行时版本和配置:

Supercreator
Supercreator

AI视频创作编辑器,几分钟内从构思到创作。

下载
 <configuration>
  <runtime>
    <gcServer enabled="true" />
    <!-- .NET 5+ 默认开启 background GC;.NET Core 3.1 需显式设置 -->
    <gcConcurrent enabled="true" />
  </runtime>
</configuration>
  • 没开 gcConcurrent:Gen 2 回收全程 STW,停顿时间 = 标记 + 清扫 + 压缩,极易在高负载下雪崩
  • 开了但用了大量 WeakReferenceFinalizer:终结器队列处理仍发生在 STW 阶段,会延长实际停顿
  • Server GC 在容器环境(如 Docker)中若未正确设置 CPU 限制,可能因检测到“单核”而退化为 Workstation GC,失去并行能力

怎么验证你的应用正被 GC 拖慢

别猜,用真实指标说话。Windows 上优先看 PerfViewGCStats 事件,重点关注三项:

  • Gen 2 Heap Size 是否持续 >200MB?说明有内存泄漏或对象驻留过久
  • Pause Time (ms) 中 Gen 2 的 P95 >15ms?基本确认是 GC 瓶颈
  • Allocation MB/Sec 突然飙升 + Gen 0 数量激增?典型是字符串拼接、JSON 序列化未复用 JsonSerializerOptions

Linux 上可用 dotnet-counters monitor -p <pid> --counters System.Runtime</pid> 实时观察 % Time in GC,超过 5% 就该介入。注意:GC Total Pause Time 是累计值,要结合 GC Count 算均值,否则单次长停顿会被稀释。

最隐蔽的问题往往出在“以为安全”的地方:比如 Entity Framework 的 AsNoTracking() 能减少 Gen 0 分配,但如果查询结果里包含未清理的导航集合(IEnumerable<t></t> 被多次枚举),反而会生成更多中间对象升代。GC 不会替你修复逻辑缺陷,只会把问题放大成延迟尖刺。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

452

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

330

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

698

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

2

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.7万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号