讲师中心 微信公众号
AI工具推荐 视频效率加速

C# 垃圾回收机制 C# GC是如何工作的

夜静姑娘_4974

夜静姑娘_4974

发布时间:2026-02-13 08:26:47

|

552人浏览过

|

来源于php中文网

原创

GC是按需触发的内存调度器,非定时清扫;通过可达性分析判断对象存活,依据根引用链;分代机制基于对象存活次数,高频小对象进SOH快速回收,大对象进LOH易碎片化;手动调用GC.Collect()通常有害,应优先监控和释放非托管资源。

c# 垃圾回收机制 c# gc是如何工作的

GC 不是后台定时清扫的“保洁员”,而是按需触发的内存调度器——它只在分配失败、系统告警或你误调用 GC.Collect() 时暂停线程,完成标记→清除→压缩三步操作。理解这点,才能避开“为什么加了 GC.Collect() 反而更卡”这种典型误区。

GC 怎么判断一个对象该被回收?

核心是可达性分析:从所有“根(Root)”出发,能触达的对象就是活的;其余一律当垃圾。根包括:static 字段、当前栈帧里的局部变量、CPU 寄存器中的引用、GC Handle、终结队列中的对象。

  • 局部变量超出作用域(如方法返回后),引用立即消失 → 对象可能在下次 Gen 0 GC 就被回收
  • 静态集合长期持有对象(比如 static List<byte> cache</byte>)→ 对象无法被根释放 → 晋升到 Gen 2,拖慢全堆回收
  • 事件未解绑(someObj.Event += handler 但没 -=)→ 订阅者被发布者强引用 → 内存泄漏高发区

为什么分代(Gen 0/1/2)?90% 的对象死在 Gen 0

分代不是分类标签,而是对象“存活次数”的动态记录:新对象进 Gen 0;活过一次 Gen 0 GC → 升 Gen 1;再活过一次 → 进 Gen 2。Gen 2 回收代价最高,应尽量避免触发。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • 高频创建小对象(如循环中 new byte[1024])→ 留在 SOH(Small Object Heap),Gen 0 快速回收,无压力
  • 频繁分配大数组(如 new double[12000] ≈ 96KB)→ 直接进 LOH(Large Object Heap)→ 只随 Gen 2 GC 清理,且不压缩 → 易碎片化、提前触发 Full GC
  • 服务器场景建议启用 gcServer=true:为每个 CPU 核心分配独立 GC 线程和堆,吞吐更高

LOH(大对象堆)为什么特别危险?

大于 85,000 字节的对象(如大数组、大字符串)自动进入 LOH。它不压缩内存,只靠空闲链表管理,碎片累积到一定程度,即使总空闲空间足够,也无法分配新大对象 → 强制触发 Gen 2 GC。

  • 错误写法:var buffer = new byte[1024 * 1024]; // 1MB → LOH
  • 推荐替代:var buffer = ArrayPool<byte>.Shared.Rent(1024 * 1024); ... ArrayPool<byte>.Shared.Return(buffer);</byte></byte>
  • .NET 6+ 可开启 LOH 压缩(需配置 gcAllowVeryLargeObjects=true + gcConcurrent=true),但仅限 Gen 2 GC 时生效,不能解决高频分配问题

什么时候该干预 GC?几乎从不该手动调用 GC.Collect()

手动触发 GC 是反模式:它强制 STW 暂停,打乱 GC 自身的节奏预测,反而加剧抖动。真正需要干预的场景极少,且方式更精细:

  • 极短生命周期关键路径(如实时音视频帧处理),可用 GC.TryStartNoGCRegion(size) 预留空间,避免途中 GC 中断
  • 长时间空闲期(如 UI 应用最小化后),可调用 GC.Collect(2, GCCollectionMode.Forced, blocking: true) —— 仅此一种较合理场景
  • 监控优先:用 GC.CollectionCount(2) 或 PerfView 查 % Time in GC,持续 >5% 才值得深挖

最常被忽略的一点:GC 不管非托管资源。文件句柄、数据库连接、GDI 对象这些,必须靠 IDisposable + using 显式释放;否则 GC 再勤快,也会因句柄耗尽而崩溃。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
js 字符串转数组
js 字符串转数组

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

1578

2023.08.03

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

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

2344

2023.09.04

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

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

5844

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5029

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

6754

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

9194

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

4659

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

4867

2025.08.07

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn