主要是对对象生命周期的相关细节的一些认识,在这里为了测试而创建一个非常大的对象数组(精确是50 000)。
首先我们需要创建Car实体类进行测试用的
class Cars
{
// Car的“状态”
public string petName;
public int currSpeed;
// 自定义的默认构造函数
public Cars()
{
petName = "Chuck";
currSpeed = 10;
}
// 在这里,currSpeed会获取int的默认值0
public Cars(string pn)
{
petName = pn;
}
// 让调用者设置Car的完整“状态”
public Cars(string pn, int cs)
{
petName = pn;
currSpeed = cs;
}
// Car的功能
public void PrintState()
{
Console.WriteLine("{0} is going {1} MPH.", petName, currSpeed);
}
public void SpeedUp(int delta)
{
currSpeed += delta;
}
}
然后在控制台Main()函数中写了一个demo用来作为垃圾回收的显示请求(通过GC.Collect()方法)。
static void Main(string[] args)
{
Console.WriteLine("**** Fun with System.GC ****");
// 输出堆上估计的字节数
Console.WriteLine("Estimated bytes on heap: {0}",
GC.GetTotalMemory(false));
// MaxGeneration是从0开始的
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("\nGeneration of refToMyCar is: {0}",
GC.GetGeneration(refToMyCar));
// 为测试目的创建对象数组
object[] tonsOfObjects = new object[50000];
for (int i = 0; i < 50000; i++)
tonsOfObjects[i] = new object();
// 仅回收第0代对象
GC.Collect(0, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
// 输出refToMyCar对象的代
Console.WriteLine("Generation of refToMyCar is: {0}",
GC.GetGeneration(refToMyCar));
// 看一下tonsOfObjects[9000]是否还活着
if (tonsOfObjects[9000] != null)
{
Console.WriteLine("Generation of tonsOfObjects[9000] is: {0}",
GC.GetGeneration(tonsOfObjects[9000]));
}
else {
Console.WriteLine("tonsOfObjects[9000] is no longer alive.");
}
// 输出一个代被清除的次数
Console.WriteLine("\nGen 0 has been swept {0} times",
GC.CollectionCount(0));
Console.WriteLine("Gen 1 has been swept {0} times",
GC.CollectionCount(1));
Console.WriteLine("Gen 2 has been swept {0} times",
GC.CollectionCount(2));
Console.ReadLine();
}
控制台启动运行,我们看下输出如下的结果
由此可以看到,即使这个Main()方法只做了一次垃圾回收的显示请求,但是CLR在幕后也执行了多次垃圾回收。