GC 是什么?

GC,全称 Garbage Collection(垃圾回收),是 .NET 中负责自动内存管理的机制。它会追踪哪些对象仍在使用,哪些可以被释放,从而避免内存泄漏和野指针问题。

托管堆(Managed Heap):GC 只回收托管堆中的对象,即通过 new 创建的对象。

非托管资源:如文件句柄、数据库连接等,需要手动释放(如使用 IDisposable 接口和 using 语句块)。

GC 触发条件:

  • 分配新对象时内存不足;
  • 系统空闲;
  • 显式调用 GC.Collect();
  • 内存压力大时。

GC 的核心目标:

  • 自动回收不再使用的对象;
  • 最大程度减少程序员管理内存的负担;
  • 提高内存使用效率;
  • 保证托管堆的整洁与高性能。

GC 回收的基本流程

C# 的 GC 主要执行以下三个步骤:

  1. 标记(Mark):找出所有还在使用的对象;
  2. 清除(Sweep):释放未被标记的内存;
  3. 压缩(Compact):整理托管堆,使内存连续,提升分配效率。

💡 .NET GC 是一个压缩式的追踪型垃圾回收器,回收后对象地址可能会发生变化。

代际(Generation)回收机制

为了优化性能,.NET GC 采用了分代回收机制,将对象分为 3 个“年龄段”:

代际 特点 回收频率
Gen 0 新生代,刚创建的对象 非常频繁
Gen 1 中生代,Gen 0 幸存者 偶尔回收
Gen 2 老年代,长期存在的对象 很少回收

这是一种“优化空间换时间”的思路——因为大多数对象生命周期很短,所以频繁回收 Gen 0 能带来巨大的性能提升。

大对象堆(Large Object Heap,LOH)

当对象超过 85,000 字节 时,会被分配到 大对象堆(LOH),特点是:

  • 只在 Gen 2 回收 时处理;
  • 不压缩,容易碎片化;
  • 推荐谨慎使用(如避免频繁创建大数组)。