GC(垃圾回收) 是 .NET CLR 提供的一种自动内存管理机制,用来回收不再被使用的托管对象。
简单理解:
当一个对象再也找不到引用它的路径时,GC 就会回收它。
特点:
GC 的核心判断标准是:
对象是否还能从 GC Root 被“访问到(Reachable)”
如果不能访问到,则对象被认为是垃圾。
GC Root 是 GC 查找引用的起点,只要对象能从这些地方被引用,就不会被回收。
常见 GC Root 包括:
为了提高性能,.NET 使用分代回收(Generational GC)。
| 代(Generation) | 说明 |
|---|---|
| Gen 0 | 新创建的对象 |
| Gen 1 | 存活过一次回收 |
| Gen 2 | 长时间存活的对象 |
说明:
GC 不会回收以下内容:
在 C# 中:
事件 = 发布者持有订阅者的强引用
示例:
class Publisher { public static event Action OnEvent; } class Subscriber { public Subscriber() { Publisher.OnEvent += Handle; } void Handle() { } }
问题:
解决方法:
UI 对象通常具有:
常见问题来源:
推荐做法:
GC 不会自动释放非托管资源。
对于以下资源:
必须实现 IDisposable:
class MyResource : IDisposable { public void Dispose() { // 手动释放非托管资源 } }
使用方式:
using (var res = new MyResource()) { // 使用资源 }
Finalizer(~ClassName):
不推荐滥用:
~MyClass() { // 不可靠,且影响性能 }
推荐使用:
GC.Collect():
结论:
什么时候必须关注 GC:
核心原则一句话:
让对象在不需要时,从所有 GC Root 中“断开引用”