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函数,防止清理冲突。

最新文章

  1. DevExpress第三方控件使用实例之ASPxPopupControl弹出子窗体
  2. paramiko 的使用
  3. 批发零售车销门店扫描打印一体移动销售POS机-移动终端销售O2O新模式
  4. System.DateUtils 4. IsValidDateTime... 有效时间判断
  5. Ext.grid.CheckboxSelectionModel状态设置
  6. Toxy新手指南
  7. android 5.0 (lollipop)源码编译环境搭建(Mac OS X)
  8. How to Resize a Datafile (文档 ID 1029252.6)
  9. hdu 4714 Tree2cycle 树形经典问题
  10. Jquery关闭离开页面时提醒
  11. 使用Sublime Text搭建python调试环境
  12. c++ 资源索引
  13. Android中SharedPreferences函数具体解释
  14. 区间gcd问题 HDU 5869 离线+树状数组
  15. Java compareTo() 方法
  16. Spring Boot会员管理系统——处理文件上传
  17. PHP+Ajax实现文件上传功能
  18. 使用xhprof对php7程序进行性能分析
  19. Mysql加锁过程详解(7)-初步理解MySQL的gap锁
  20. Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现

热门文章

  1. Java clone方法(下)
  2. 在Windows下编译Emacs
  3. springmvc最简单的搭建,初学者必看
  4. Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
  5. [Android Pro] Android源码编译之Nexus5真机编译
  6. [MAC OS] XCode中的Debug View Hierarchy功能
  7. Git 学习(六)分支管理
  8. Objective-C:保留计数器思想的详解(对象的保留和所有权的释放)
  9. C++ 使用TinyXML解析XML文件
  10. Android高效加载大图、多图解决方案,有效避免程序内存溢出现象