.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函数,防止清理冲突。
相关文章
- .Net 应用考虑x64生成
- Asp.net web.config customErrors 如何设置
- ASP.NET MVC (五、HttpClient接口解析)
- .NET周报【12月第1期 2022-12-08】
- .NET周报【1月第4期 2023-01-28】
- 【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(随机流程)
- Linux-apache部署多个.net项目
- centOS7 NET模式设置静态Ip的方法步骤
- 阿里云发布声明与IPIP.NET达成版权争议和解 承认有员工存在违规情况
- 联手开发:.NET与Oracle的合作之路(.net和oracle)
- 原理揭秘.NET 运用Redis图灵缓存原理(.net缓存redis)
- Net缓存技术Redis:管理数据量大的梦想(net缓存技术redis)
- Oracle Database: The Ultimate Connection Guide for .NET Developers(net连接oracle)
- VB.NET构建多层数据库应用:使用MSSQL(vb.net mssql)
- 使用Net实现Oracle数据库的快速导入(net导入oracle)
- 数据使用NET改变Oracle数据库的奥秘(net修改oracle)
- Net调用MySQL技术实践(.net 调用mysql)
- 网上解决Net环境下MySQL数据库的同步问题(.net 同步mysql)
- 型使用NET与MySQL开发动态类型Web应用程序(.net mysql 类)
- asp.net下用url重写URLReWriter实现任意二级域名的方法
- 用ASP.NET做的个性化的邮件发送系统
- asp.net获取指定文件夹下所有子目录及文件(树形)
- .net上传文件前所未有的简单
- ASP.NET水晶报表打印功能实现代码
- asp.net获取某个时间段的星期并以表格形式排列出来
- ASP.NET中各个后缀名的含义介绍
- ASP.Net页尾中添加JavaScript的最佳方法实战分享
- asp.net获取URL和IP地址的方法汇总
- VB.NET中删除DataGridView中所选行的小例子
- VB.NET设置屏幕分辨率、颜色位数、刷新率实例代码
- .NET纯分页代码实例
- .NET事件监听机制的局限与扩展分析