.NET垃圾回收机制知识点整理
1. .NET资源分托管资源和非托管资源,对于托管资源,.NET GC可以很好的回收无用的垃圾,而对于非托管(例如文件访问,网络访问等)需要手动清理垃圾(显式释放)。
2. 非托管资源的释放,.NET提供了两种方式:
1).Finalizer:写法貌似C++的析构函数,本质上却相差甚远。Finalizer是对象被GC回收之前调用的终结器,初衷是在这里释放非托管资源,但由于GC运行时机的不确定性,通常会导致非托管资源释放不及时。另外,Finalizer可能还会有意想不到的副作用,比如:被回收的对象已经没有被其他可用对象所引用,但Finalizer内部却把它重新变成可用,这就破坏了GC垃圾收集过程的原子性,增大了GC开销。
2).Dispose模式:C#提供using关键字支持Dispose Pattern进行资源释放。这样能通过确定的方式释放非托管资源,而且using结构提供了异常安全性。所以,一般建议采用Dispose Pattern,并在Finalizer中辅以检查,如果忘记显式Dispose对象则在Finalizer中释放资源。
3. 托管资源的回收,判断对象是否要被回收只要判定此对象或者其包含的子对象没有任何引用是有效的
4. GC的代价:一则丧失了托管资源回收的实时性,二是没有把C#托管资源和非托管资源的管理统一起来,造成概念割裂
5. .NET类型分两大类:引用类型、值类型,值类型分配在栈上,不需要GC回收;引用类型分配在堆上,它的释放和回收需要GC来完成。一个引用类型的对象要被回收,需要要成为垃圾
6. 系统为GC安排了独立线程,对于内存回收GC采取了一定的优先算法进行轮循回收内存资源
7. Generation(代),为了提高性能,越老的对象存活的越久。.NET中一般分为三代,G0,G1,G2;G0***被回收。
8. 垃圾回收的步骤,标记->整理->终结
9. GC.Collect()一般要和GC.SuppressFinalize函数配合使用,使用GC.SuppressFinalize函数,防止清理冲突。
原文链接:http://www.cnblogs.com/myangel/archive/2011/12/24/2300207.html
【编辑推荐】
相关文章
- DDD领域驱动设计 — 贫血模型与充血模型
- EasyNVR使用中磁盘I/O读写跟不上hls流ts切片速度如何解决?
- JSON和AJAX知识点整理
- 激怒开源社区,微软悄悄删除 2500 行功能代码后致歉:已恢复!
- SSM整合案例
- 请简述跨域的几种方式
- WPF 制作一个占用文件的测试工具
- WPF 使用 VisualBrush 在 4k 加 200 DPI 设备上某些文本不渲染看不见问题
- WPF 使用 MyScript 的 IInk 做手写识别
- 解决下载Visual Studio出现下载条一直是0的情况
- .Net 垃圾回收和大对象处理
- 实现针对不同.net版本的条件编译
- 针对不同.NET版本的条件编译
- Winform开发框架演化历史
- 一个.Net程序员关于学习的思考顺带思考人生
- 实例讲解.NET多线程执行函数
- 如何查找.NET程序内存不断上涨的原因
- .NET提供的加密算法概述
- 检测常见ASP.NET配置安全漏洞
- Web服务小姐的嫁衣 (一)