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.为命名空间申明别名

  • 相关阅读:
    C++中char*,String,int,CString间转换
    获取本地MAC地址和多IP
    子窗口
    linux记录键盘
    curses和窗口
    使用curses函数写的hello world 程序
    Java 复习笔记
    Ubuntu apt install 下载软件很慢的解决办法
    Ubuntu python多个版本管理
    VMware下的Ubuntu16设置连接主机网络,设置主机下可以通过xshell访问 VMware下的Ubuntu
  • 原文地址:https://www.cnblogs.com/chenxiaoran/p/2079536.html
Copyright © 2011-2022 走看看