垃圾回收
1. CLR的一个核心功能是-垃圾回收
2. 垃圾回收的目的:提高内存利用率。
3. 对于值类型和栈空间,程序使用完之后,就立刻进行释放。而对于引用类型来说,是不一定什么时候进行垃圾回收。但是当一个空间不被引用,说明该空间可以被释放,但具体的释放时间不确定。
4. 手动进行垃圾回收的方法:Gc.Collect()。注意:一般情况下,不需要我们刻意手动去进行垃圾回收,因为这会降低系统性能。有些时候,预测到下面的代码需要耗费很大的内存,因此就需要我们手动去进行垃圾回收。
5. 垃圾回收器,只回收托管中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等。)
6.垃圾回收器中的"代"的概念:
共3代:第0代、第1代、第2代。
各代的回收频率:第0代最高,其次是第1代,再次是第2代。也就是说越老的对象生存几率越大。
7. 有时候我们会调用操作系统中的某些方法【非托管资源】,这样我们就无法控制来释放其中开辟的内存。所以我们就需要使用操作系统里面的释放资源方法来释放对应的内存。一般情况下,哪些释放"非托管资源的代码"就放在Dispose()里面。
8. C#中的"终结函数"【其他语言中叫做"析构函数"】:
当调用系统中的方法时"非托管资源",想要释放其内存空间,我们也可以在"终结函数"里面进行释放。
终结函数中的代码,它什么时候执行?
当释放内存空间的时候,不是立刻就回收,而是等到垃圾回收机制回收的时候,会先执行"终结函数"里面的代码然后,在进行一些"托管资源"的释放。而非托管资源使用完毕之后,需要立刻释放,所以这种方式不合适。因此我们就可以使用Dispose()方法,手动对"非托管资源"进行回收。
那么如何去使用Dispose()方法?
要想使用Dispose()方法,我们必须在某个调用非托管资源的类中,实现IDispose接口,这样机会实现Dispose()方法,然后当程序员使用完这个类后,手动调用这个方法就可以了。