C# GC 类的详细使用说明

  1. GC.Collect方法

    • 功能
      • 强制进行垃圾回收。垃圾回收器(GC)通常会根据自己的策略来决定何时回收内存,例如当内存压力达到一定阈值或者在程序执行的空闲时段。但使用GC.Collect可以手动触发回收过程。
    • 参数和重载
      • 它有多个重载形式。其中最常用的是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可能会影响性能,因为垃圾回收本身是一个消耗资源的过程。
  2. 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个对象后再次获取内存量,通过差值计算出这些对象占用的内存。
  3. GC.SuppressFinalize方法

    • 功能
      • 用于通知垃圾回收器,指定的对象不需要调用终结器(Finalizer)。在C#中,终结器是一种特殊的方法(以~开头),用于在对象被垃圾回收时执行一些清理操作,通常用于释放非托管资源。如果对象已经在Dispose方法(当实现IDisposable接口时)或者其他地方手动释放了资源,就可以使用GC.SuppressFinalize来避免不必要的终结器调用。
    • 参数和重载
      • 它只接受一个参数,即要抑制终结器调用的对象。
    • 示例
      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方法清理了,就不会再调用终结器。
  4. GC.WaitForPendingFinalizers方法

    • 功能
      • 使当前线程暂停,直到所有带有终结器的对象的终结器都被调用完成。这在某些情况下很有用,例如当需要确保所有非托管资源都被正确释放后再继续执行程序的其他部分。
    • 参数和重载
      • 它没有参数。
    • 示例
      class Program
      {
          static void Main()
          {
              MyResource resource = new MyResource();
              resource = null;
              GC.Collect();
              GC.WaitForPendingFinalizers();
              Console.WriteLine("所有终结器执行完毕");
          }
      }
      
      • 这里创建了一个MyResource对象,然后使其成为垃圾,手动触发垃圾回收后,使用GC.WaitForPendingFinalizers等待终结器执行完毕,最后输出提示信息。
  5. GC.GetGeneration方法

    • 功能
      • 用于获取指定对象所属的代。如前面提到的,对象在垃圾回收中有代的划分,这有助于提高垃圾回收的效率。通过GC.GetGeneration可以了解对象在垃圾回收体系中的位置。
    • 参数和重载
      • 它只接受一个参数,即要查询代的对象。
    • 示例
      class Program
      {
          static void Main()
          {
              object myObject = new object();
              int generation = GC.GetGeneration(myObject);
              Console.WriteLine($"对象所属代: {generation}");
          }
      }
      
      • 这个示例中,创建一个对象后,使用GC.GetGeneration方法获取它所属的代,并输出结果。
  6. GC.MaxGeneration方法

    • 功能
      • 返回系统支持的最大代数值。在.NET中,通常最大代是2,但这个值可能会因运行时环境或者配置的不同而有所变化。通过GC.MaxGeneration可以获取这个最大值,用于在一些与代相关的操作中作为边界条件。
    • 参数和重载
      • 它没有参数。
    • 示例
      class Program
      {
          static void Main()
          {
              int maxGeneration = GC.MaxGeneration;
              Console.WriteLine($"最大代: {maxGeneration}");
          }
      }
      
      • 此示例简单地获取并输出了最大代的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生命不息-学无止境

你的每一份支持都是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值