zoukankan      html  css  js  c++  java
  • 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.为命名空间申明别名

  • 相关阅读:
    java中如何模拟真正的同时并发请求?
    安全并发之先行发生原则
    定时器的实现原理及参考
    kafka扫盲笔记,实战入门
    空手套白狼,硬阅java字节码class文件
    Rpc框架dubbo-client(v2.6.3) 源码阅读(二)
    如何获取java运行时动态生成的class文件?
    微软职位内部推荐-SDEII
    微软职位内部推荐-Senior SDE
    微软职位内部推荐-Software Engineer II-Senior Software Engineer for Satori
  • 原文地址:https://www.cnblogs.com/chenxiaoran/p/2079536.html
Copyright © 2011-2022 走看看