关于GC中Generation的一个疑惑
有关于GC.MaxGeneration的说明参考微软的MSDN。
我在测试GetGeneration()方法的时候发现一个问题,
背景如下:
两个类FirstClass和SomeClass
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();
1、fObj.GenerateSomeRubbish();
2、sObj.sameToUp();
GC.GetGeneration(fObj);//返回2
GC.GetGeneration(sObj);//返回2
如果屏蔽1、两个都返回0,
如果屏蔽2、两个都返回2
如果都屏蔽,都返回0。
在上边的Code中,FirstClass和SomeClass并没有很大的区别。
表面上来看,其实都是产生一堆新的字符串对象而已,在寻找原因…….
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个,第三代的垃圾就不限制了?
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号