.Net资源管理机制
由于内存是由GC来控制,无论对象网是简单的还是复杂的,都不需要开发者手工去管理,因为GC的Mark and Compact算法会迅速的检测这些关系,并把那些不可达的对象视为一个整体从内存清理出去。
1、GC的检测过程是从应用程序的根对象出发,把与该对象之间没有通路相连的那些对象判定为不可达的对象。应用程序如果不再使用某个实体,那么就不会继续引用它,于是,GC就会发现这个实体是可以回收的。
垃圾回收器每次运行的时候,都会压缩托管堆,以便把其中的活动对象安排在一起,使得空闲的内存能够形成一块连续的区域。类似下图所示:
2、针对托管堆(CLR中内存管理的基础,维护着一个指针,用它指向将在堆中分配的下一个对象的地址)的内存管理工作完全是由垃圾回收器负责,但除此之外的其它资源则必须有开发者来管理。
3、有两种机制可以控制非托管资源的生存期,一种是finalizer,另外一种是IDisposable接口。
finializer是一种防护机制,可以确保对象总是能够把非托管资源释放掉,但这种机制有很多缺陷(没有补充原因),于是,应该考虑通过IDisposable接口来更为顺畅的将资源及时返还给系统。
【Effective C#读书笔记】