C# System.GC类型

Mscorlib.dll程序集提供了名为System.GC的类类型,它可以通过编程使用一些静态成员与垃圾回收器进行交互。这里要特别注意的是,极少属于在代码中直接使用这个类。一般情况下,只有在创建那些非托管资源的类时,才需要使用System.GC成员。例如.Net平台调用协议调用基于C的Windows API,或一些非常低级且复杂的COM互操作逻辑。
下面提供一些类型成员
在这里插入图片描述
为了了解如何使用System.GC类型来获取垃圾回收的细节,在Main()方法,它使用了GC的部分成员:

static void Main2(string[] args)
        {
            Console.WriteLine("***** Fun with System.GC ****");

            // 输出堆上估计的字节数量
            Console.WriteLine("Estimated bytes on heap: {0}",
                GC.GetTotalMemory(false));

            // MaxGeneration是由0开始,因此为了显示的目的加上了1
            Console.WriteLine("This OS has {0} object generations.\n",
                (GC.MaxGeneration + 1));
            Car refToMyCar = new Car("Zippy", 100);
            Console.WriteLine(refToMyCar.ToString());

            // 输出refToMyCar对象的代
            Console.WriteLine("Generation of refToMyCar is: {0}",
                GC.GetGeneration(refToMyCar));
            // 只检查第0代对象
            GC.Collect(0);
            GC.WaitForPendingFinalizers();

            Console.ReadLine();
        }

Car类的构造方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestCSharp
{
    class Car
    {
        // Car的"状态"
        public string petName;
        public int currSpeed;

        // 自定义的默认构造函数
        public Car()
        {
            petName = "Chuck";
            currSpeed = 10;
        }

        // 在这里,currSpeed会获取int的默认值0
        public Car(string pn, int cs)
        {
            petName = pn;
            currSpeed = cs;
        }
    }
}

在控制台输出的结果如下图所示:
在这里插入图片描述

强制垃圾回收
.NET垃圾回收器的功能是代替我们管理内存。然而,在一些非常罕见的环境下,通过编程使用GC.Collect()强制垃圾回收可能回收有好处。下面是要考虑的两个常见的场景:

  1. 应用程序要进入一段代码,后者不希望被可能的垃圾回收中断;
  2. 应用程序刚刚分配非常多的对象,你想尽可能的多地删除已获取的内存。
    如果确定让垃圾回收器马上检查不可访问对象可能有好处,就显式触发一次垃圾回收,如下所示:
    在这里插入图片描述
    当手动强制垃圾回收时,应该总是调用GC.WaitForPendingFinalizers()。这样你可以稍等片刻,以确定程序继续执行之前,所有可终结的对象都必须执行所有必要的清除工作。在底层,GC.WaitForPendingFinalizers()会在回收过程中挂起调用的“线程”,因为它保证代码不调用当前正在被销毁的对象的方法。
    当GC.Collect()方法提供一个数值,该数值表示垃圾回收将要操作的最老的代,
    例如CLR只检查第0代对象:
    在这里插入图片描述
    像任何垃圾回收一样,调用GC.Collect()会提升被回收的对象的代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值