垃圾回收(Garbage Collection,GC)
是 C# 中的内存管理机制,它负责自动识别和释放不再使用的对象,以避免内存泄漏和资源浪费。垃圾回收的原理是通过标记和清除不再被引用的对象来进行的。让我们通过一个示例来详细说明垃圾回收的原理和用法。
示例:
假设我们有一个简单的类 Person:
public class Person
{
public string Name { get; set; }
public Person(string name)
{
Name = name;
}
}
现在,我们创建一些 Person 对象,并在一定时间后释放对其中一些对象的引用:
Person person1 = new Person("Alice");
Person person2 = new Person("Bob");
// 让 person2 不再引用 person2 对象
person2 = null;
// 此时,person1 对象仍然被引用,person2 对象不再被引用
垃圾回收器会在适当的时候检测到不再被引用的对象,并在内存中清除它们。在这个示例中,一段时间后,垃圾回收器会发现 person2 对象不再被引用,因此会将其释放。垃圾回收过程包括以下步骤:
标记阶段: 垃圾回收器从根对象(如堆栈、静态变量)开始遍历对象图,标记所有仍然被引用的对象。
清除阶段: 在标记阶段后,垃圾回收器会清除那些未被标记的对象,即被认为是不再被引用的对象。这些对象的内存将被回收。
压缩/整理阶段(可选): 在某些情况下,垃圾回收器还可能进行内存压缩或整理,以消除内存碎片并进一步优化内存分配。
垃圾回收的用法:
在 C# 中,垃圾回收是自动进行的,无需手动介入。但有一些情况下,您可以在代码中显式调用垃圾回收来提供一些指导或优化。
// 手动触发垃圾回收
GC.Collect();
// 获取当前堆内存的使用情况
long memoryUsed = GC.GetTotalMemory(false);
通常情况下,不建议频繁地手动触发垃圾回收,因为垃圾回收会消耗一些性能资源。垃圾回收会在运行时自动管理内存,适时地进行垃圾回收以维持内存的有效使用。在大多数情况下,只需关注编写正确的代码,并确保您的对象不再被使用时将其置为 null,以便垃圾回收器能够及时释放内存