-
GC.Collect
方法- 功能
- 强制进行垃圾回收。垃圾回收器(GC)通常会根据自己的策略来决定何时回收内存,例如当内存压力达到一定阈值或者在程序执行的空闲时段。但使用
GC.Collect
可以手动触发回收过程。
- 强制进行垃圾回收。垃圾回收器(GC)通常会根据自己的策略来决定何时回收内存,例如当内存压力达到一定阈值或者在程序执行的空闲时段。但使用
- 参数和重载
- 它有多个重载形式。其中最常用的是
GC.Collect()
无参数形式,这种形式会对所有代(Generation)进行垃圾回收。代是垃圾回收中的一个概念,.NET将对象分为0代、1代和2代。新创建的对象一般是0代,经过一次垃圾回收后存活的对象可能会被提升到更高的代。另一种常见的重载是GC.Collect(int generation)
,它可以指定只对特定代进行垃圾回收。例如,GC.Collect(0)
只会回收0代对象。
- 它有多个重载形式。其中最常用的是
- 示例
class Program { static void Main() { // 创建一些对象 List<object> objects = new List<object>(); for (int i = 0; i < 1000; i++) { objects.Add(new object()); } // 手动触发垃圾回收 GC.Collect(); } }
- 在这个示例中,先创建了1000个对象,然后手动调用
GC.Collect
进行垃圾回收。不过要注意,过度使用GC.Collect
可能会影响性能,因为垃圾回收本身是一个消耗资源的过程。
- 在这个示例中,先创建了1000个对象,然后手动调用
- 功能
-
GC.GetTotalMemory
方法- 功能
- 用于获取当前为对象分配的总内存量(以字节为单位)。这有助于监控程序的内存使用情况,例如在性能优化或者内存泄漏检测时非常有用。
- 参数和重载
- 它有一个布尔类型的参数
forceFullCollection
。如果设置为true
,则在获取内存使用量之前会先强制进行一次完整的垃圾回收,这样得到的结果更能反映实际被对象占用的内存;如果设置为false
,则不会强制回收,只是返回当前估计的内存使用量。
- 它有一个布尔类型的参数
- 示例
class Program { static void Main() { long initialMemory = GC.GetTotalMemory(false); // 创建一些对象 List<object> objects = new List<object>(); for (int i = 0; i < 1000; i++) { objects.Add(new object()); } long afterMemory = GC.GetTotalMemory(false); Console.WriteLine($"内存增加了: {afterMemory - initialMemory}字节"); } }
- 这个示例中,先获取初始内存量,然后创建1000个对象后再次获取内存量,通过差值计算出这些对象占用的内存。
- 功能
-
GC.SuppressFinalize
方法- 功能
- 用于通知垃圾回收器,指定的对象不需要调用终结器(Finalizer)。在C#中,终结器是一种特殊的方法(以
~
开头),用于在对象被垃圾回收时执行一些清理操作,通常用于释放非托管资源。如果对象已经在Dispose
方法(当实现IDisposable
接口时)或者其他地方手动释放了资源,就可以使用GC.SuppressFinalize
来避免不必要的终结器调用。
- 用于通知垃圾回收器,指定的对象不需要调用终结器(Finalizer)。在C#中,终结器是一种特殊的方法(以
- 参数和重载
- 它只接受一个参数,即要抑制终结器调用的对象。
- 示例
class MyResource : IDisposable { private bool disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { // 释放托管资源 } // 释放非托管资源 disposed = true; } } ~MyResource() { Dispose(false); } }
- 在这个示例中,
MyResource
类实现了IDisposable
接口。在Dispose
方法中,当资源被正确释放后,调用GC.SuppressFinalize(this)
,这样如果对象被正确地通过Dispose
方法清理了,就不会再调用终结器。
- 在这个示例中,
- 功能
-
GC.WaitForPendingFinalizers
方法- 功能
- 使当前线程暂停,直到所有带有终结器的对象的终结器都被调用完成。这在某些情况下很有用,例如当需要确保所有非托管资源都被正确释放后再继续执行程序的其他部分。
- 参数和重载
- 它没有参数。
- 示例
class Program { static void Main() { MyResource resource = new MyResource(); resource = null; GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine("所有终结器执行完毕"); } }
- 这里创建了一个
MyResource
对象,然后使其成为垃圾,手动触发垃圾回收后,使用GC.WaitForPendingFinalizers
等待终结器执行完毕,最后输出提示信息。
- 这里创建了一个
- 功能
-
GC.GetGeneration
方法- 功能
- 用于获取指定对象所属的代。如前面提到的,对象在垃圾回收中有代的划分,这有助于提高垃圾回收的效率。通过
GC.GetGeneration
可以了解对象在垃圾回收体系中的位置。
- 用于获取指定对象所属的代。如前面提到的,对象在垃圾回收中有代的划分,这有助于提高垃圾回收的效率。通过
- 参数和重载
- 它只接受一个参数,即要查询代的对象。
- 示例
class Program { static void Main() { object myObject = new object(); int generation = GC.GetGeneration(myObject); Console.WriteLine($"对象所属代: {generation}"); } }
- 这个示例中,创建一个对象后,使用
GC.GetGeneration
方法获取它所属的代,并输出结果。
- 这个示例中,创建一个对象后,使用
- 功能
-
GC.MaxGeneration
方法- 功能
- 返回系统支持的最大代数值。在.NET中,通常最大代是2,但这个值可能会因运行时环境或者配置的不同而有所变化。通过
GC.MaxGeneration
可以获取这个最大值,用于在一些与代相关的操作中作为边界条件。
- 返回系统支持的最大代数值。在.NET中,通常最大代是2,但这个值可能会因运行时环境或者配置的不同而有所变化。通过
- 参数和重载
- 它没有参数。
- 示例
class Program { static void Main() { int maxGeneration = GC.MaxGeneration; Console.WriteLine($"最大代: {maxGeneration}"); } }
- 此示例简单地获取并输出了最大代的值。
- 功能
C# GC 类的详细使用说明
最新推荐文章于 2025-06-16 10:36:22 发布