C# 中的垃圾回收(Garbage Collection, GC)是由 .NET 运行时(CLR)自动管理的内存回收机制。它的主要目的是自动释放不再使用的对象所占用的内存,以防止内存泄漏和优化内存使用。下面是 C# 中垃圾回收算法的详细流程:
1. 垃圾回收的基本概念
- 托管堆:所有的托管对象都分配在托管堆上。
- 代(Generation):垃圾回收器将托管堆分为三代:第 0 代、第 1 代和第 2 代。新分配的对象属于第 0 代,存活时间较长的对象会被提升到更高的代。
- 根(Root):根是指程序中直接引用的对象,包括全局变量、静态变量、栈上的局部变量和 CPU 寄存器中的变量。
2. 垃圾回收的触发条件
垃圾回收器在以下情况下可能会触发垃圾回收:
- 托管堆内存不足。
- 系统内存不足。
- 显式调用
GC.Collect()
方法。 - 其他特定条件(如应用程序进入空闲状态)。
3. 垃圾回收的流程
1. 标记阶段(Marking Phase)
垃圾回收器首先会标记所有可达的对象。可达对象是指从根开始,通过引用链可以访问到的对象。标记阶段的主要步骤如下:
- 初始化根集合:找到所有的根对象。
- 递归标记