CLR via c#读书笔记垃圾回收

访问一个资源的步骤:
1.调用IL指令newobj,为资源分配内存
2.初始化内存,设置资源的初始化状态。类型的实例构造器负责设置初始化状态。
3.摧毁资源的状态进行清理
4.释放内存

托管堆:
进程在初始化时,CLR要保留一块连续的地址空间,这块空间最初并没有对应的物理存储空间。
这个地址空间就是托管堆。

垃圾回收:
第一步:标记阶段
标记所有的根沿着线程栈,如果发现一个根引用了一个对象,就在这个对象的同步块索引字段上开启第一位。
--对象就这样被标记了

第二步:压缩阶段
已标记的对象是认为是可以通过应用程序到达的对象,未标记的对象是不可到达的。不可到达的对象被认为是
垃圾。
垃圾回收只在第0代满的时候发生。

非托管资源:
文件、网络链接、套接字、互斥体或其它类

终结操作:
是CLR提供的一种机制,允许对象在垃圾回收器回收其内存之前执行一些得体的清理操作。

导致垃圾回收的事件:
1.第0代满时(最常用的一种调用方式)
2.调用GC.Collect()方法时
3.windows报告内存不足时
4.CLR卸载AppDomain时,CLR通过使用win32 CreateMemoryResourceNofication和QueryMemoryResourceNofication函数来监视系统的总体内存。
5.CLR关闭时
每个Finalize反映时间为2秒,所有的Finalize反映时间为40秒。

关于终结操作的揭秘:
终结列表:
应用程序在创建一个新对象时,new操作符会从堆中分配内存,如果该对象的类型定义了Finalize方法,那么在该对象调用实例构造器之前,会将指向该对象的一个指针放一个到终结列表中。

Freachable队列:
当一个对象已经被判定为垃圾后,垃圾回收器会扫描终结列表,然后将该指针从终结列表移到Freachable列表中。而Freachable列表是Finalize方法已经准备调用的一个对象。

Dispose模式:
类型为了提供确定性dispose或关闭对象的能力,要实现所以的Dispose模式。
dispose强调的是释放资源或着清理对象,在清理完成(它包装的)资源的清理之后,对象本身的内存并不会释放
重要提示:
如果类定义了一个字段,而该字段的类型实现了Dispose模式,那么类本身也应实现Dispose模式。
使用场景:
1.确定清理资源(如关闭打开的文件)
2.确定可以安全的调用Dispose或Close,并希望将对象从终结列表中删除,禁止对象提升到下一代。

C#的Using语句
1.用于那些实现了IDisposable接口的类型。
2.声明命名空间
3.为命名空间申明别名

原文地址:https://www.cnblogs.com/chenxiaoran/p/2079536.html