柚子Nan--回归原点

Everything can be as easy as you like or as complex as you need.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

垃圾收集学习笔记(第2章)

Posted on 2004-05-31 14:17  柚子Nan  阅读(1745)  评论(5编辑  收藏  举报

关于GCGeneration的一个疑惑

 

有关于GC.MaxGeneration的说明参考微软的MSDN

 

我在测试GetGeneration()方法的时候发现一个问题

背景如下:

两个类FirstClassSomeClass

FirstClass

{

       private int MaxLine = 1000;

       ~FirstClass()  

       {

       }

       // 这个函数将不能通过编译

       // protected override void Finalize()

       // {               

       //     MaxLine = 0;

       // }

       public void GenerateSomeRubbish()

       {

              string strMM;

              for(int i=0;i<MaxLine;i++)

              {

                     strMM = new string('a',MaxLine);

              }

       }

}

public class SomeClass

{

       public SomeClass()

       {

       }

       public void sameToUp()

       {

              string str;

              for(int i=0;i<10;i++)

              {

                      str = new string('a',10);

              }

       }

}

在一个Main中测试GC.GetGeneration()方法。

FirstClass fObj = new FirstClass();

SomeClass  sObj = new SomeClass();

1fObj.GenerateSomeRubbish();

2sObj.sameToUp();

GC.GetGeneration(fObj);//返回2

GC.GetGeneration(sObj);//返回2

 

如果屏蔽1、两个都返回0

如果屏蔽2、两个都返回2

如果都屏蔽,都返回0

 

在上边的Code中,FirstClassSomeClass并没有很大的区别。

表面上来看,其实都是产生一堆新的字符串对象而已,在寻找原因…….

1、难道是因为有个析构函数,后来发现删除后也没有关系。

2、难道是因为定义了一个局部的变量MaxLine,改动后也不是。

3、莫非是MaxLine的大小有影响?

我就把MaxLine改成了100,重新执行GC.GetGeneration(fObj),发现返回的是1,看来确实就是了。

这就有趣了,那就测试一下所有的大小了J

 

System.IO.StreamWriter sw = new System.IO.StreamWriter(@"d:\kkk.txt");

for(int i=0; i< 10000; i++)

{

       fObj.GenerateSomeRubbish(i);//这里改动了GenerateSomeRubbish,只是增加一个参数

       sw.Write(i.ToString()+"\t");

       sw.WriteLine(GC.GetGeneration(fObj));

}

 

哈哈,结果如下

数字

代数

0

0

1

0

2

0

.....

 

48

0

49

0

50

1

51

1

....

 

485

1

486

1

487

2

488

2

 

不知道为什么?为什么会产生代数不相同的情况?

难道是微软的.net Framework规定了第1代的垃圾数量是50个,然后第2代的垃圾是427个,第三代的垃圾就不限制了?