关于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个,第三代的垃圾就不限制了?