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