C# 的垃圾回收机制
GC 是什么?
GC,全称 Garbage Collection(垃圾回收),是 .NET 中负责自动内存管理的机制。它会追踪哪些对象仍在使用,哪些可以被释放,从而避免内存泄漏和野指针问题。
托管堆(Managed Heap):GC 只回收托管堆中的对象,即通过 new 创建的对象。
非托管资源:如文件句柄、数据库连接等,需要手动释放(如使用 IDisposable 接口和 using 语句块)。
GC 触发条件:
- 分配新对象时内存不足;
- 系统空闲;
- 显式调用
GC.Collect(); - 内存压力大时。
GC 的核心目标:
- 自动回收不再使用的对象;
- 最大程度减少程序员管理内存的负担;
- 提高内存使用效率;
- 保证托管堆的整洁与高性能。
GC 回收的基本流程
C# 的 GC 主要执行以下三个步骤:
- 标记(Mark):找出所有还在使用的对象;
- 清除(Sweep):释放未被标记的内存;
- 压缩(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 回收 时处理;
- 不压缩,容易碎片化;
- 推荐谨慎使用(如避免频繁创建大数组)。
本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kirius!