垃圾回收
2015-08-03 08:33
169 查看
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()方法,然后当程序员使用完这个类后,手动调用这个方法就可以了。
![](http://images0.cnblogs.com/blog/679141/201508/030833194556978.png)
2. 垃圾回收的目的:提高内存利用率。
3. 对于值类型和栈空间,程序使用完之后,就立刻进行释放。而对于引用类型来说,是不一定什么时候进行垃圾回收。但是当一个空间不被引用,说明该空间可以被释放,但具体的释放时间不确定。
4. 手动进行垃圾回收的方法:Gc.Collect()。注意:一般情况下,不需要我们刻意手动去进行垃圾回收,因为这会降低系统性能。有些时候,预测到下面的代码需要耗费很大的内存,因此就需要我们手动去进行垃圾回收。
5. 垃圾回收器,只回收托管中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等。)
6.垃圾回收器中的"代"的概念:
共3代:第0代、第1代、第2代。
各代的回收频率:第0代最高,其次是第1代,再次是第2代。也就是说越老的对象生存几率越大。
7. 有时候我们会调用操作系统中的某些方法【非托管资源】,这样我们就无法控制来释放其中开辟的内存。所以我们就需要使用操作系统里面的释放资源方法来释放对应的内存。一般情况下,哪些释放"非托管资源的代码"就放在Dispose()里面。
8. C#中的"终结函数"【其他语言中叫做"析构函数"】:
当调用系统中的方法时"非托管资源",想要释放其内存空间,我们也可以在"终结函数"里面进行释放。
终结函数中的代码,它什么时候执行?
当释放内存空间的时候,不是立刻就回收,而是等到垃圾回收机制回收的时候,会先执行"终结函数"里面的代码然后,在进行一些"托管资源"的释放。而非托管资源使用完毕之后,需要立刻释放,所以这种方式不合适。因此我们就可以使用Dispose()方法,手动对"非托管资源"进行回收。
那么如何去使用Dispose()方法?
要想使用Dispose()方法,我们必须在某个调用非托管资源的类中,实现IDispose接口,这样机会实现Dispose()方法,然后当程序员使用完这个类后,手动调用这个方法就可以了。
![](http://images0.cnblogs.com/blog/679141/201508/030833194556978.png)
相关文章推荐
- 属性( @property )与成员变量的那些事 :
- HDOJ~~A + B Problem II
- p1474
- ETO、MTO、ATO与MTS(按单设计、按单生产、按单装配和库存生产)
- unity的自动寻路之 ------ wayPoint寻路的实现方式
- HDU 3308 LCIS(线段树区间合并)
- Related Problems
- RecyclerView的高级用法——定制动画
- 郝斌视频学习笔记006
- Keil MDK5.15使用Jlink下载时出现Jlink clone版无法使用
- 【Nginx-反向代理服务器】基础知识(二)之多进程模式
- ABP(现代ASP.NET样板开发框架)系列之16、ABP应用层——数据传输对象(DTOs)
- 空格填充器(alignBySpace)
- 第14章 位图和位块传输_14.4 GDI位图对象(1)
- C语言简介
- HT for Web基础动画介绍
- day13
- 探讨read的返回值的三种情况
- 软件设计文档应该如何写?转载
- 开源 java CMS - FreeCMS2.3会员我的投稿