zoukankan      html  css  js  c++  java
  • 垃圾回收机制 、垃圾回收算法 CLR学习第十七课 狼

    一、垃圾回收是只是回收引用类型实例、及实例的2个附件对象的所在的堆控件;值

    类型无无回收概念;值类型实例所占的内存是位于当前运行线程的堆栈上,当值类型

    实例变量所在的方法执行结束,他们的内存将随着堆栈空间的消亡而自动消失。

    二、垃圾回收是一件复杂的活,c#提供了GC(grabage collection)专门用于自动回

    收垃圾,的垃圾机制,垃圾回收一般被放在 Finalize、Dispose、close方法中。

    三、clr所需要的内存资源都是中托管堆分配的,当应用程序初始化后,clr将保留一

    块连续的地址空间。这端空间最初并不对应任何的物理内存,该地址空间即为托管堆

    ,托管堆上维护一个指针(NextObjPtr),该指针标识着下一个新建对象分配是在托

    管堆中所处的位置,刚开始NextObjPtr被设为Clr保留地址空间的基地址。

    四、new一个对象时发生如下操作:1.计算类型所有字段所需要的字节总数。2.在所

    有字节总数的基础上加上对象二位附件成员需要的字节数(一个方法表指针,一个

    SyncBlockIndex,各自在32位系统中,占8个字节,64位中占16个字节)。3.lcr检查

    保留区域中的空间是否满足分配对象所需要的字节数---如果需要则提交物理内存。

    如果满足,对象将被分配到NextObjPtr指针所指示的地方,接着,类型的实例构造器

    被调用(NextObjPtr指针回报传递给this参数),IL指令newobj(或者new操作符)返

    回为其分配的内存地址,就在newObje指令返回新对象地址之前,NextObjePtr指针会

    越过新对象所处的内存区域,并指示出下一个新建对象在托管堆中的地址;当托管堆

    中没有足够的地址空间分配时,托管堆将需要执行垃圾收集。

    五、每一个应用程序都有一个跟组,一个根是一个存储位置,其中包含着一个指向引

    用类型的内存指针,该指针或者指向一恶搞托管堆的对象,或者被设为null;如所有

    的全局引用类型变量或静态引用类型变量都被认为是跟,另外,一个线程堆栈上的所

    有引用类型的本地变量或者参数变量也被认为是一个根,最后在一个方法内,指向引

    用类型对象的cpu寄存器也被认为是一个根。

    六、当jit编译器编译一个方法的IL代码是,除了产生本地的cpu代码外,jit编译器

    还会创建一个内部的表,该表中的每一个条目都标识着一个方法的本地cpu指令的字

    节偏移范围,以及该范围中一组包含跟的内存地址(或者cpu寄存器)。

    如果在0x0000021到0x00000122之间代码执行时开始了垃圾回收,那么Gc将知道参数this、参数arg2、本地变量fs、寄存器EBX都是跟他们引用的托管堆中的对象将不会被认为是可以回收的垃圾对象,除此之外,垃圾收集器还可以遍历线程的调用堆栈,通过检测其中的每一个方法的内部来确定所有调用方法的跟,最后垃圾收集器可以使用其他的手段来获得存储在全局引用类型变量和静态引用类型变量中保存的跟,一旦一个对象不再可到达,他就是垃圾收集的候选对象--clr并不保证对象在整个生存期内都一直存活。


    当垃圾收集器开始执行的时候,他首先假设托管堆中所有的对象都是可以收集的垃圾

    ,然后垃圾收集器遍历所有的跟,构造出一个包含有可达对象的图,一旦给部分的可

    达对象图完成以后,垃圾收集器检查下一个跟,并遍历其引用的对象,当垃圾收集器

    在对象之间遍历是,如果他试图将一个已经加过的对象再遍历一次添加到可达对象图

    中时,他会停止沿着该对象标识的路径方向上的遍历获得,这种行为有2个目的,首

    先是可以编码垃圾收集器对一些对象执行多次遍历,客观上提供了性能,其次是对象

    之间出现循环引用,可以避免遍历陷入无限循环。垃圾收集器一旦检查玩所有的跟,

    其得到的可达对象图将包含所有从应用出现的跟可以访问的对象,任何不在该图中的

    对象都将是应用程序不可以访问的对象,因此也是可以被执行垃圾收集的对象。垃圾

    收集器接着线性地遍历托管堆一寻找包含可收集垃圾对象的连续区块,如果找到教大

    的连续区块,垃圾收集器将把内存中的一些非垃圾对象搬移到这个连续区块中,以压

    缩托管堆,显然内存中的对象将使所有执行这些对象的指针变得无效,所以垃圾收集

    器必须修改应用程序的跟以是他们指向这些对象跟新后的位置,另外,如果任何对象

    包含有指向这些对象的指针,那么垃圾收集器也会负责矫正他们,在托管堆的内存被

    压缩后,托管堆上的NextObjPtr指针将被设置为指向最后一个份垃圾对象之后(带来

    应用程序性能损伤)。

    七、做为开发人员,我们不必在自己实现代码来管理应用程序的生存期,其次任何不

    可以从任何应用程序的跟访问的对象都会在某个时刻被收集

  • 相关阅读:
    读取美团购
    获取enum的Description
    获取手机号码所在地
    手动添加XA/XD的端口和磁盘映射
    无法使用SQL Server Management Studio的找到Network Server
    [XenDesktop5.5]+HyperV上的Win7+VDA无法启用Aero效果
    傻瓜式设置WANem配置 (点对点网络设置)
    [XD5.5]如何关闭XD的Audio UDP通道
    使用TCP方式登陆OCS
    在Linux上建立文件夹指向在Win共享的文件夹
  • 原文地址:https://www.cnblogs.com/gowhy/p/2016945.html
Copyright © 2011-2022 走看看