2026-06-09 / C# / .NET Core
.NET 托管堆与垃圾回收:对象生命周期怎么被管理
从对象分配、可达性、代际回收到 IDisposable,理解 GC 解决什么,也不解决什么。
.NETC#
.NET 托管堆与垃圾回收:对象生命周期怎么被管理
new 不只是创建实例,它会让 CLR 在托管堆上分配对象。对象分配通常很快,但回收、压缩和晋升都需要运行时付出成本。
flowchart TB
A["new 对象"] --> B["托管堆分配"]
B --> C["对象仍可达"]
C --> D["继续存活"]
C --> E["不可达"]
E --> F["GC 标记 / 清理 / 压缩"]
为什么是追踪式 GC
引用计数无法很好处理循环引用。CLR 使用追踪式 GC:从根对象出发,找到仍然可达的对象,其余对象就可以回收。
代际回收有效,是因为大部分对象生命周期很短。第 0 代频繁回收,长寿对象才会晋升到更老的代。
实践建议
- 不要在热点循环里制造大量临时对象。
- 不要让静态集合长期持有本该释放的对象。
- 文件句柄、网络连接等非托管资源要及时
Dispose。 - GC 管内存,不等于帮你管理所有资源生命周期。