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 管内存,不等于帮你管理所有资源生命周期。
.NET 托管堆与垃圾回收:对象生命周期怎么被管理 | Remi Resume