目录

C# 中的 GC 回收基础与注意事项

1. 什么是 GC(Garbage Collection)

GC(垃圾回收) 是 .NET CLR 提供的一种自动内存管理机制,用来回收不再被使用的托管对象

简单理解:
当一个对象再也找不到引用它的路径时,GC 就会回收它。

特点:


2. GC 如何判断对象是否需要回收

GC 的核心判断标准是:

对象是否还能从 GC Root 被“访问到(Reachable)”

如果不能访问到,则对象被认为是垃圾。


3. 什么是 GC Root

GC Root 是 GC 查找引用的起点,只要对象能从这些地方被引用,就不会被回收。

常见 GC Root 包括:


4. GC 回收的基本流程

  1. 从所有 GC Root 开始遍历
  2. 标记所有可达对象
  3. 未被标记的对象视为垃圾
  4. 释放其占用的内存

5. GC 的分代机制

为了提高性能,.NET 使用分代回收(Generational GC)

代(Generation) 说明
Gen 0 新创建的对象
Gen 1 存活过一次回收
Gen 2 长时间存活的对象

说明:


6. GC 不会回收哪些东西

GC 不会回收以下内容:


7. 事件与 GC(最常见的内存泄漏来源)

在 C# 中:

事件 = 发布者持有订阅者的强引用

示例:

class Publisher
{
    public static event Action OnEvent;
}
 
class Subscriber
{
    public Subscriber()
    {
        Publisher.OnEvent += Handle;
    }
 
    void Handle() { }
}

问题:

解决方法:


8. UI / Panel 中的 GC 注意事项

UI 对象通常具有:

常见问题来源:

推荐做法:


9. IDisposable 与 GC 的关系

GC 不会自动释放非托管资源

对于以下资源:

必须实现 IDisposable:

class MyResource : IDisposable
{
    public void Dispose()
    {
        // 手动释放非托管资源
    }
}

使用方式:

using (var res = new MyResource())
{
    // 使用资源
}

10. Finalizer(析构函数)

Finalizer(~ClassName):

不推荐滥用:

~MyClass()
{
    // 不可靠,且影响性能
}

推荐使用:


11. GC.Collect() 的正确认知

GC.Collect():

结论:


12. 常见 GC 误区


13. 实践总结

什么时候必须关注 GC:

核心原则一句话:

让对象在不需要时,从所有 GC Root 中“断开引用”