Unity 和 C# 的 GC 剖析与对比 --- 全篇导览
系列总览 :103 篇文章 · 16 个篇章 · 16 个主题文件夹
定位 :从认知到源码,从原理到实战的 GC 技术百科全书
目标读者:Unity 游戏开发者、C# 后端开发者、性能优化工程师、技术面试准备者
📖 为什么需要这个系列?
垃圾回收(Garbage Collection, GC)是每个 C# 开发者都无法回避的核心话题。在 Unity 游戏开发中,GC 问题更是性能优化的头号敌人------一次不当的 GC 触发就可能导致帧率骤降、卡顿甚至闪退。然而,GC 并非黑盒不可知:从 Mono 的古老 Boehm GC,到 SGen 的分代收集,再到 Unity 的增量式 GC,以及 .NET Core 的高性能 Server GC,每种 GC 都有其设计哲学、适用场景和性能特征。
本系列旨在填补中文技术社区在 GC 深度剖析领域的空白,带你从四个层次逐步深入:
| 层次 | 解决的问题 |
|---|---|
| 认知层 | GC 为什么存在?内存管理的本质矛盾是什么? |
| 原理层 | Mark-Sweep 怎么工作?分代 GC 为什么快? |
| 源码层 | ⭐ 最核心的价值------四大 GC(Mono SGen / Boehm / Unity Incremental / .NET Core)逐行注释级源码解读 |
| 实战层 | 如何在真机项目中诊断、优化、甚至定制 GC? |
🗺️ 篇章总览
Unity和C#的GC剖析与对比/
├── 00-全篇导览与书写计划/ (1篇) 系列总览与导览说明
├── 01-认知篇/ (6篇) GC的本质与内存模型
├── 02-原理篇/ (8篇) GC核心算法与机制
├── 03-架构篇/ (7篇) 五大GC运行时架构
├── 04-源码深度-Mono GC/ (5篇) Mono SGen 源码逐行解读
├── 05-源码深度-Boehm GC与IL2CPP/ (5篇) Boehm GC 源码逐行解读
├── 06-源码深度-Unity增量式GC/ (5篇) Incremental GC 源码逐行解读
├── 07-源码深度-.NET Core GC/ (6篇) .NET Core GC 源码逐行解读
├── 08-核心技术-性能优化篇/ (10篇) 语言/引擎/工程三层优化体系
├── 09-核心技术-内存管理篇/ (6篇) 资源生命周期与GC协同
├── 10-核心技术-托管互操作篇/(6篇) C#/C++边界与零GC方案
├── 11-演进篇-GC发展史/ (5篇) 三大GC发展线横向对比
├── 12-实战篇-问题诊断/ (8篇) Profiler/快照/CI诊断体系
├── 13-实战篇-优化案例/ (10篇) 按游戏类型分类的案例解析
├── 14-进阶篇-定制化GC实战/ (5篇) 从零构建自定义GC
├── 15-面试篇/ (10篇) 连锁追问树面试指南
└── 16-附录/ (3篇) 术语/资源/版本
📚 各篇章详解
00-全篇导览与书写计划(1 篇)--- 系列导航
| 编号 | 文件名 | 核心内容 |
|---|---|---|
| 001 | 00-全篇导览 |
系列总览、篇章地图、推荐阅读路径、内容统计 |
01-认知篇(6 篇)--- GC 的本质与内存模型
解决什么问题:GC 为什么存在?内存管理的本质矛盾是什么?C# 和 Unity 的内存模型有何不同?
| 编号 | 文件名 | 核心内容 | 关键问题 |
|---|---|---|---|
| 002 | 01-认知篇-GC存在的根本原因 |
自动内存管理 vs 手动管理、GC 的设计目标与权衡 | GC 为什么是必要的? |
| 003 | 01-认知篇-内存管理的本质矛盾 |
吞吐量 vs 暂停时间 vs 内存开销的不可能三角 | 为什么没有完美的 GC? |
| 004 | 01-认知篇-C#内存模型深度解析 |
托管堆/栈、值类型/引用类型、GC Roots 定义 | C# 的内存是如何组织的? |
| 005 | 01-认知篇-Unity内存全景 |
托管/原生/引擎/GPU 四层内存边界划分 | Unity 的内存边界在哪里? |
| 006 | 01-认知篇-GC性能归因分析 |
算法缺陷 vs 使用不当、常见归因误区 | GC 问题到底是谁的锅? |
| 007 | 01-认知篇-总览-五大GC全景对比 |
Mono SGen/Boehm/Incremental/.NET Core GC/Server GC 总览 | 五大 GC 各有什么优缺点? |
02-原理篇(8 篇)--- GC 核心算法与机制
解决什么问题:GC 的核心算法是什么?分代、增量、并发这些技术各自解决了什么问题?
| 编号 | 文件名 | 核心内容 | 关键问题 |
|---|---|---|---|
| 008 | 02-原理篇-Mark-Sweep与变种算法 |
Mark-Sweep / Mark-Compact / Copying 算法原理与对比 | 三种经典算法各有什么优劣? |
| 009 | 02-原理篇-分代GC(Generation GC) |
代际假说、新生代/老年代、晋升策略、Write Barrier | 分代 GC 为什么快? |
| 010 | 02-原理篇-大对象堆(LOH) |
LOH 定义、分配策略、碎片化问题、LOH 压缩 | 大对象为什么特殊对待? |
| 011 | 02-原理篇-GC Roots与对象图遍历 |
Roots 种类、对象图遍历算法(BFS/DFS)、三色标记 | GC 如何知道哪些对象是活的? |
| 012 | 02-原理篇-Finalization机制深度解析 |
Finalize 队列、复活现象、Dispose 模式、析构函数 | Finalizer 是如何工作的?有什么陷阱? |
| 013 | 02-原理篇-增量式GC与并发GC |
增量式/并发式/并行式 GC 的区别、写屏障、安全点 | 如何减少 GC 暂停时间? |
| 014 | 02-原理篇-GC暂停时间的本质 |
Stop-The-World、安全点(Safepoint)、GC 触发时机、暂停来源分析 | GC 暂停到底花在了哪里? |
| 015 | 02-原理篇-GC的视野边界 |
GC 能管理什么/不能管理什么、非托管资源的 GC 视角、句柄引用 | GC 的管控范围有多大? |
03-架构篇(7 篇)--- 五大 GC 运行时架构
解决什么问题:不同 GC 运行时的架构是如何设计的?它们在运行时中如何嵌入和协调?
| 编号 | 文件名 | 核心内容 | 关键问题 |
|---|---|---|---|
| 016 | 03-架构篇-Mono GC架构解析 |
Mono 运行时架构、SGen GC 嵌入位置、GC 线程模型 | Mono 的 GC 是如何融入运行时的? |
| 017 | 03-架构篇-Boehm GC架构解析 |
Boehm 保守式 GC 原理、IL2CPP 中的 Boehm 集成、保守 vs 精确 | IL2CPP 为什么用 Boehm?它有什么限制? |
| 018 | 03-架构篇-SGen GC架构解析 |
SGen 分代式设计、Nursery / Major Heap、并行标记 | SGen 相比 Boehm 提升了什么? |
| 019 | 03-架构篇-Unity增量式GC架构解析 |
增量式 Mark-Sweep 设计、时间分片策略、Unity 中的定制改动 | Unity 增量式 GC 是怎么减少卡顿的? |
| 020 | 03-架构篇-.NET Core GC架构解析 |
Server GC / Workstation GC、SOH/LOH/POH、段管理、后台 GC | .NET Core GC 为什么是工业级标杆? |
| 021 | 03-架构篇-运行时与GC的嵌入关系 |
运行时初始化、GC 注册 Roots、内存分配路径、GC 触发链路 | GC 在运行时启动后是如何被调用的? |
| 022 | 03-架构篇-平台差异的深层原因 |
Android / iOS / Windows / WebGL 各平台 GC 差异及根因 | 为什么同一代码在不同平台 GC 行为不同? |
04-源码深度-Mono GC(5 篇)--- Mono SGen 逐行解读
解决什么问题:Mono SGen 的源码是如何实现的?关键数据结构和算法是怎样的?
| 编号 | 文件名 | 核心内容 | 对应源码文件 |
|---|---|---|---|
| 023 | 04-源码-Mono GC总览与数据结构 |
sgen-gc.h/c 核心结构体、线程局部分配、全局堆结构 | sgen-gc.c, sgen-gc.h |
| 024 | 04-源码-Mono GC分配路径深度解析 |
分配管线、bump-pointer 分配、TLAB、大对象分配 | sgen-alloc.c |
| 025 | 04-源码-Mono GC标记阶段逐行解读 |
标记栈、对象图遍历、灰色节点处理、并行标记 | sgen-mark.c, sgen-gray.h |
| 026 | 04-源码-Mono GC清扫与压缩阶段 |
Sweep 算法、空闲链表构建、Compact / Copying 实现 | sgen-sweep.c, sgen-copy-object.h |
| 027 | 04-源码-Mono GC分代与晋升机制 |
Nursery 收集、Major 收集、代际晋升、Remembered Set | sgen-nursery.c, sgen-major.c |
05-源码深度-Boehm GC 与 IL2CPP(5 篇)--- Boehm GC 逐行解读
解决什么问题:Boehm GC 作为保守式 GC 的代表,其源码实现有何特点?IL2CPP 如何与之集成?
| 编号 | 文件名 | 核心内容 | 对应源码文件 |
|---|---|---|---|
| 028 | 05-源码-Boehm GC总览与数据结构 |
标记-清扫循环、GC_proc 结构体、堆段管理 | alloc.c, gc_priv.h |
| 029 | 05-源码-Boehm GC标记阶段 |
保守标记算法、root 发现、partial clean 机制 | mark.c, dbg_mlc.c |
| 030 | 05-源码-Boehm GC分配与碎片管理 |
分大小类分配、空闲链表、碎片合并、懒惰 Free | alloc.c, reclaim.c |
| 031 | 05-源码-Boehm GC在IL2CPP中的集成 |
IL2CPP 如何适配 Boehm、GC 排除列表、内存屏障 | il2cpp-gc.h, boehm-gc.cpp |
| 032 | 05-源码-Boehm GC的局限与替代演进 |
保守式的根因限制、SGen 替代计划、精确 GC 在 IL2CPP 中的未来 | 跨文件分析 |
06-源码深度-Unity 增量式 GC(5 篇)--- Incremental GC 逐行解读
解决什么问题:Unity 增量式 GC 是如何实现时间分片的?与标准 Mark-Sweep 有何不同?
| 编号 | 文件名 | 核心内容 | 对应源码文件 |
|---|---|---|---|
| 033 | 06-源码-Incremental GC总览与设计 |
增量式 GC 设计目标、与 SGen 的关系、配置参数 | GarbageCollector.h |
| 034 | 06-源码-增量标记算法实现 |
三色标记增量版、work 分片、写屏障实现 | IncrementalGC.cpp |
| 035 | 06-源码-时间分片与调度策略 |
每帧分配时间片、动态调整算法、暂停预测 | GarbageCollector.cpp |
| 036 | 06-源码-增量式GC的分配与写屏障 |
Card Table 实现、对象引用变更追踪、脏卡处理 | WriteBarrier.cpp |
| 037 | 06-源码-增量式GC的性能特征与限制 |
增量式 GC 的适用场景、CPU 开销分析、与并发 GC 对比 | 综合对比分析 |
07-源码深度-.NET Core GC(6 篇)--- .NET Core GC 逐行解读
解决什么问题:.NET Core GC 作为当今最先进的 GC 之一,其源码设计有何精妙之处?
| 编号 | 文件名 | 核心内容 | 对应源码文件 |
|---|---|---|---|
| 038 | 07-源码-.NET Core GC总览与架构 |
段管理、堆结构、GC 分代、Server/Workstation 模式 | gc.h, gcimpl.h |
| 039 | 07-源码-.NET Core GC分配路径 |
分配上下文、bump 分配、budget 管理、LOH/VOH 分配 | gc.cpp (allocate) |
| 040 | 07-源码-.NET Core GC标记与扫描 |
并行标记、背景标记、卡片标记、对象图遍历优化 | gc.cpp (mark) |
| 041 | 07-源码-.NET Core GC清扫与压缩 |
计划阶段、压缩阶段、空闲列表管理、页内碎片整理 | gc.cpp (sweep/compact) |
| 042 | 07-源码-.NET Core GC后台GC实现 |
后台标记、后台清扫、并发线程、与前台 GC 交互 | gc.cpp (background) |
| 043 | 07-源码-.NET Core GC的极致优化技术 |
段预映射、大页面支持、CPU 分组亲和、GC 感知的分配 | gc.cpp (advanced) |
08-核心技术-性能优化篇(10 篇)--- 三层优化体系
解决什么问题:如何在 C# 和 Unity 中系统性地减少 GC 压力?
| 编号 | 文件名 | 核心内容 | 优化维度 |
|---|---|---|---|
| 044 | 08-优化-字符串与文本操作的GC陷阱 |
字符串拼接、Substring、StringBuilder、ToString 优化 | 语言层面 |
| 045 | 08-优化-LINQ与函数式编程的GC代价 |
LINQ 闭包分配、迭代器、Select/Where GC 分析、替代方案 | 语言层面 |
| 046 | 08-优化-闭包与匿名函数的GC分配 |
捕获变量导致的对象分配、委托分配、static 缓存优化 | 语言层面 |
| 047 | 08-优化-装箱与反射的GC开销 |
值类型装箱、typeof/GetType/MethodInfo 缓存方案 | 语言层面 |
| 048 | 08-优化-值类型与struct的正确使用 |
栈分配、Copy 开销、只读 struct、ref return、in 参数 | 语言层面 |
| 049 | 08-优化-async状态机与Task的GC优化 |
状态机结构体、async ValueTask、Pooling、ConfigureAwait | 语言层面 |
| 050 | 08-优化-Span与零分配编程 |
Span/Memory 原理、栈分配数组、字符串切片零分配 | 语言层面 |
| 051 | 08-优化-Unity API的GC陷阱清单 |
GameObject.Find/Tag/Mesh/Physics 等 API 触发 GC 分析 | 引擎层面 |
| 052 | 08-优化-渲染管线与音频系统的GC分析 |
粒子系统、物理引擎、音频播放的 GC 触发点 | 引擎层面 |
| 053 | 08-优化-帧级预算与GC生命周期策略 |
GC 预算模型、分步回收策略、对象池体系、场景加载 GC 控制 | 工程层面 |
09-核心技术-内存管理篇(6 篇)--- 资源生命周期与 GC 协同
解决什么问题:Unity 资源系统的内存管理与 GC 如何协同工作?
| 编号 | 文件名 | 核心内容 | 解决的关键问题 |
|---|---|---|---|
| 054 | 09-内存-Unity资源生命周期全景 |
资源从加载到卸载的完整链路、引用计数底层机制 | 资源是怎么在内存中活着的? |
| 055 | 09-内存-AssetBundle与Addressables内存策略 |
AssetBundle 内存布局、Addressables 缓存策略、资源预加载 | 如何在 AB 系统中减少 GC 压力? |
| 056 | 09-内存-GPU显存管理与GC边界 |
纹理/网格/RenderTexture 显存分配、GC 不管理的 GPU 资源 | GPU 内存为什么 GC 管不了? |
| 057 | 09-内存-Unity原生对象生命周期 |
UnityEngine.Object 生命周期、C# 代理对象、DON'T Destroy 模式 | 原生对象与托管对象的生死关联 |
| 058 | 09-内存-场景与关卡切换的内存风暴 |
场景切换的 GC 峰值、渐进式卸载、Additive 场景管理 | 如何避免场景切换时的 GC 卡顿? |
| 059 | 09-内存-资源泄漏检测与治理 |
常见泄漏模式、快照对比、引用链分析、自动化泄漏检测 | 如何发现和修复资源泄漏? |
10-核心技术-托管互操作篇(6 篇)--- C#/C++ 边界与零 GC
解决什么问题:如何在 C# 和 C++ 边界处管理内存?如何利用 Unity 的底层系统实现零 GC?
| 编号 | 文件名 | 核心内容 | 解决的关键问题 |
|---|---|---|---|
| 060 | 10-互操作-C#与C++边界的内存管理 |
P/Invoke、Marshal、内存封送、GC 与原生内存交互 | 托管-原生边界的内存归谁管? |
| 061 | 10-互操作-Unsafe代码与手动内存管理 |
unsafe 指针、stackalloc、fixed 语句、手动分配与释放 | 如何在 C# 中手动管理内存? |
| 062 | 10-互操作-JobSystem与GC隔离 |
Job 结构体限制、NativeContainer 类型、Job 中的 GC 安全 | Job 为什么不能访问托管对象? |
| 063 | 10-互操作-NativeContainer深度解析 |
NativeArray/NativeList/NativeHashMap 实现原理、分配器 | NativeContainer 是如何绕过 GC 的? |
| 064 | 10-互操作-Burst Compiler与GC消除 |
Burst 编译原理、托管调用消除、纯 IL2CPP 代码路径 | Burst 如何做到零 GC? |
| 065 | 10-互操作-DOTS-ECS的零GC架构 |
Archetype、Chunk、Component 内存布局、System 无 GC 执行 | ECS 架构为什么能避免 GC? |
11-演进篇-GC 发展史(5 篇)--- 三大 GC 发展线
解决什么问题:.NET、Mono、Unity 三条 GC 发展线是如何演进的?未来的趋势是什么?
| 编号 | 文件名 | 核心内容 | 关键问题 |
|---|---|---|---|
| 066 | 11-演进-.NET GC发展史 |
.NET Framework → .NET Core → .NET 5+ GC 演进、关键里程碑 | .NET GC 这 20 年是怎么进化的? |
| 067 | 11-演进-Mono GC发展史 |
早期 Boehm → SGen → Hybrid SUS 演进路线 | Mono GC 为什么走了弯路? |
| 068 | 11-演进-Unity GC发展史 |
Unity 5 之前 → IL2CPP Boehm → Incremental GC → 未来方向 | Unity 的 GC 之路有何特殊性? |
| 069 | 11-演进-国际横向对比 |
JVM GC(G1/ZGC/Shenandoah) vs .NET GC vs Mono GC 对比 | Java 的 GC 领先在哪里?C# 能学什么? |
| 070 | 11-演进-未来趋势与技术展望 |
无 GC 语言兴起、GC 硬件加速、Region-based 内存管理 | GC 的未来是消亡还是进化? |
12-实战篇-问题诊断(8 篇)--- 完整诊断方法论
解决什么问题:如何在真机环境中定位和分析 GC 问题?
| 编号 | 文件名 | 核心内容 | 工具/方法 |
|---|---|---|---|
| 071 | 12-诊断-Profiler精通指南 |
Unity Profiler GC 模块详解、Deep Profile、Profiler Marker | Unity Profiler |
| 072 | 12-诊断-帧级GC追踪技术 |
单帧 GC 分配追踪、分配栈、每帧 GC 预算管理 | Profiler + 自定义工具 |
| 073 | 12-诊断-内存快照差分分析 |
Memory Profiler 快照、堆对象对比、泄漏对象定位 | Memory Profiler |
| 074 | 12-诊断-真机多平台GC差异分析 |
iOS Metal/Android Vulkan/Windows DX12 GC 行为对比 | 平台 Profiler |
| 075 | 12-诊断-堆增长曲线与GC模式分析 |
堆大小时间序列、GC 频率/持续时间统计、模式识别 | 自定义分析工具 |
| 076 | 12-诊断-CI/CD中的GC自动化监测 |
自动化内存测试、GC 分配回归检测、CI 门禁 | CI Pipeline |
| 077 | 12-诊断-外部工具链集成 |
PerfView/.NET Memory Profiler/dotMemory/WinDbg 在 Unity 中的应用 | 外部工具链 |
| 078 | 12-诊断-从崩溃到GC的根因追溯 |
常见 GC 相关崩溃模式、Dump 分析、GC 日志解读 | 崩溃分析 |
13-实战篇-优化案例(10 篇)--- 按游戏类型分类
解决什么问题:不同类型的游戏(UI/战斗/开放世界等)各自的 GC 问题有何特征?如何解决?
| 编号 | 文件名 | 核心内容 | 案例类型 |
|---|---|---|---|
| 079 | 13-案例-UI系统的GC优化 |
列表滚动 GC、UI 更新频率控制、Text 复用池、图集管理 | UI 密集型 |
| 080 | 13-案例-战斗系统的GC优化 |
技能创建与销毁、子弹池、伤害数字 GC、Buff/Debuff 管理 | 战斗密集型 |
| 081 | 13-案例-动画系统的GC优化 |
Animator GC 问题、AnimationClip 加载、IK 更新、状态机分配 | 动画密集型 |
| 082 | 13-案例-寻路与AI系统的GC优化 |
NavMesh 更新、A* 路径缓存、行为树节点池、感知系统 | AI 密集型 |
| 083 | 13-案例-网络同步与序列化GC优化 |
消息序列化 GC、内存流复用、协议缓冲池、心跳 GC | 网络密集型 |
| 084 | 13-案例-MMO-开放世界的GC管理 |
大地图区域加载、Entity 生命周期、场景流式加载、LOD GC | 大型世界 |
| 085 | 13-案例-FPS-MOBA的实时GC策略 |
高帧率下的 GC 预算、武器系统零分配、技能预分配 | 实时竞技 |
| 086 | 13-案例-VR-AR的极致GC要求 |
VR 帧率要求下的 GC 策略、双眼渲染 GC、交互反馈零分配 | VR/AR |
| 087 | 13-案例-音频与物理系统的GC优化 |
AudioSource 管理、物理碰撞事件 GC、触发器回调优化 | 音频/物理 |
| 088 | 13-案例-项目级GC优化全流程 |
从立项到上线完整 GC 治理流程、性能门禁体系、迭代优化 | 全流程 |
14-进阶篇-定制化 GC 实战(5 篇)--- 从零构建自定义 GC
解决什么问题:如何从零构建一个可运行的 GC?通过实操理解 GC 的本质。
| 编号 | 文件名 | 核心内容 | 实践目标 |
|---|---|---|---|
| 089 | 14-进阶-最小Mark-Sweep框架 |
内存池管理、标记栈实现、清扫算法、完整可运行的 Mini GC | 实现一个能工作的 GC |
| 090 | 14-进阶-引入分代与紧缩 |
两代设计、新生代 Copying、老年代 Mark-Compact、晋升策略 | 为 Mini GC 加入分代 |
| 091 | 14-进阶-时间分片增量回收 |
增量标记实现、写屏障、安全点、调度器 | 实现增量式 GC |
| 092 | 14-进阶-与工业级GC的对比反思 |
Mini GC vs SGen vs .NET Core GC 对比、学到了什么 | 反思与洞察 |
| 093 | 14-进阶-定制GC在Unity中的集成实验 |
在 Unity 中使用自定义分配器、替换默认 GC 的可行性分析 | 极限探索 |
15-面试篇(10 篇)--- 连锁追问树面试指南
定位 :针对 Unity 客户端/C# 后端开发面试中 GC 相关的所有考点。每道题包含:主答 → 追问 → 深度追问。
| 编号 | 文件名 | 覆盖领域 | 核心面试题(示例) |
|---|---|---|---|
| 094 | 15-面试篇-基础概念与原理 |
GC 基础、算法、分代、LOH | • GC 是什么?为什么需要 GC? • Mark-Sweep 和 Mark-Compact 的区别? • 分代 GC 为什么高效?代际假说是什么? |
| 095 | 15-面试篇-C#内存管理深度 |
值类型/引用类型、堆/栈、装箱/闭包 | • 值类型和引用类型在内存上有什么区别? • 装箱是如何发生的?如何避免? • 闭包导致 GC 分配的原理?如何修复? |
| 096 | 15-面试篇-Unity GC专项 |
Unity GC 特点、增量式 GC、API 陷阱 | • Unity 的 GC 和普通 .NET GC 有什么不同? • Unity 增量式 GC 的原理和限制? • 列举 Unity API 中常见的 GC 陷阱? |
| 097 | 15-面试篇-IL2CPP GC专项 |
Boehm 限制、SGen、IL2CPP 内存管理 | • IL2CPP 为什么使用 Boehm GC?有什么问题? • IL2CPP 在 iOS 上的内存管理有什么特殊之处? |
| 098 | 15-面试篇-DOTS-ECS与GC |
JobSystem、Burst、NativeContainer | • ECS 如何实现零 GC? • NativeContainer 为什么不受 GC 管理? • Burst Compiler 如何消除托管调用? |
| 099 | 15-面试篇-源码分析与GC原理 |
GC 源码、算法实现细节 | • GC Roots 有哪些种类?Mono 和 .NET Core 的 Roots 有什么不同? • 三色标记算法的详细过程?增量式 GC 如何解决漏标问题? |
| 100 | 15-面试篇-实战优化经验 |
项目优化案例、问题定位 | • 项目上线后遇到 GC 导致的卡顿,如何排查? • 如何制定团队 GC 优化规范? |
| 101 | 15-面试篇-代码审查与GC |
CR 中的 GC 问题识别 | • 代码 Review 时如何发现 GC 问题? • 以下这段代码有什么 GC 问题?(给出代码片段) |
| 102 | 15-面试篇-场景设计与架构 |
大规模场景下的内存架构 | • 设计一个大型开放世界的资源管理系统,如何控制 GC? • 场景切换时如何避免 GC 风暴? |
| 103 | 15-面试篇-版本演进与未来 |
GC 发展史、趋势、对比 | • 从 .NET Framework 到 .NET Core,GC 做了哪些重大改进? • GC 会被替代吗?Region-based 内存管理会成为未来吗? |
16-附录(3 篇)
| 编号 | 文件名 | 核心内容 |
|---|---|---|
| 附录A | 附录A-术语表.md |
GC 核心术语中英文对照(分配/标记/清扫/压缩/分代/增量/并发/安全点 等) |
| 附录B | 附录B-参考资源.md |
GC 经典论文/书籍/博客/源码仓库/视频课程 |
| 附录C | 附录C-版本信息.md |
Mono/Unity/.NET SDK 版本与对应 GC 版本的兼容性 |
🎯 推荐阅读路径
根据你的背景和目标,选择最适合的阅读路径:
路径 A:快速扫盲(1-2 小时)
01-认知篇 → 02-原理篇(核心算法) → 11-演进篇 → 15-面试篇(基础题)
适合:面试冲刺、GC 概念补强、想快速建立 GC 知识体系。
路径 B:优化实战(1-2 天)
01-认知篇 → 02-原理篇 → 08-优化篇 → 09-内存篇 → 12-诊断篇 → 13-案例篇
适合:项目正面临 GC 性能问题,需要系统化解决方案。
路径 C:源码研究(1-2 周)
02-原理篇 → 03-架构篇 → 04~07-源码深度(四大GC) → 14-进阶篇(定制GC)
适合:底层研究者、运行时贡献者、技术狂热者。
路径 D:零 GC 方案专项(1 天)
01-认知篇(内存全景) → 10-互操作篇 → 08-优化篇(Span/DOTS相关)
适合:对 DOTS/ECS/Burst 零 GC 方案感兴趣。
路径 E:全面精通(2-3 个月)
全部 105 篇文章,按编号顺序阅读
适合:希望成为 GC 领域专家的开发者。
📊 内容统计
| 维度 | 数据 |
|---|---|
| 文章总数 | 105 篇(持续更新中) |
| 篇章数量 | 16 个 |
| 主题文件夹 | 16 个 |
| 覆盖 GC 运行时 | Mono SGen、Boehm GC、Unity Incremental GC、.NET Core GC、Server GC |
| 源码覆盖路径 | sgen-gc.c、alloc.c、mark.c、IncrementalGC.cpp、gc.cpp、gc.h |
| 对比方案 | Mono GC vs .NET Core GC vs JVM GC 横向对比 |
| 实战案例覆盖 | UI/战斗/动画/AI/网络/MMO/开放世界/FPS/MOBA/VR/音频/物理 |
| 面试题数量 | 10 篇 × 5~8 题 = 50+ 道连锁追问题 |
| 目标 Unity 版本 | 2018.4 ~ 6000.x |
| 目标 .NET 版本 | .NET Framework 4.x ~ .NET 8/9 |
| 覆盖平台 | Windows/macOS/iOS/Android/WebGL |
🔗 快速导航
| 篇章 | 文件数 | 快速链接 |
|---|---|---|
| 导览与计划 | 1 | 00-全篇导览与书写计划/ |
| 认知篇 | 6 | 01-认知篇/ |
| 原理篇 | 8 | 02-原理篇/ |
| 架构篇 | 7 | 03-架构篇/ |
| 源码-Mono GC | 5 | 04-源码深度-Mono GC/ |
| 源码-Boehm GC | 5 | 05-源码深度-Boehm GC与IL2CPP/ |
| 源码-Incremental GC | 5 | 06-源码深度-Unity增量式GC/ |
| 源码-.NET Core GC | 6 | 07-源码深度-.NET Core GC/ |
| 性能优化 | 10 | 08-核心技术-性能优化篇/ |
| 内存管理 | 6 | 09-核心技术-内存管理篇/ |
| 托管互操作 | 6 | 10-核心技术-托管互操作篇/ |
| 演进史 | 5 | 11-演进篇-GC发展史/ |
| 问题诊断 | 8 | 12-实战篇-问题诊断/ |
| 优化案例 | 10 | 13-实战篇-优化案例/ |
| 定制化 GC | 5 | 14-进阶篇-定制化GC实战/ |
| 面试篇 | 10 | 15-面试篇/ |
| 附录 | 3 | 16-附录/ |
最后更新 :2026-07-14
维护状态 :持续更新中
定位:中文技术社区最全面的 Unity/C# GC 深度剖析系列