第21章 自动内存管理(垃圾回收)
21.8 Dispose 模式:强制对象清理资源
Finalize的调用时间是不能保证的。
21.10 C#的using语句
在using语句中,我们初始化一个对象,并将它的引用保存到一个变量中。然后在using语句的大括号内访问该变量。编译这段代码时,编译器自动生成一个try块和一个finally块。在finally块中,编译器会生成代码将变量转型成一个IDisposable并调用Dispose方法。显然,using语句只能用于那些实现了IDisposable接口的类型。
using (Stream st = new FileStream("c:", FileMode.Create))
{
}
21.14 代
托管堆在初始化时不包含任何对象。添加到堆的对象称为第0代对象。第0代对象就是那些新构造的对象,垃圾回收器从未检查过它们。
对第0代的垃圾回收之后,幸存下来的第0代对象变成了第1代的一部分。
C#的托管堆只支持三代:第0代、第1代和第2代。没有第3代。第0代的预算约为256KB,第1代约为2MB,第2代约为10MB。
如果没有回收到足够的内存,垃圾回收器会执行一次完整回收。如果还是不够,就抛出OutOfMemoryException异常。
21.17 编程控制垃圾回收器
可以读取GC.MaxGeneration属性来查询托管堆支持的最大代数;该属性总是返回2.