垃圾收集器介绍

垃圾收集器:java

        引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用时。计数器值就增长1;当引用失效时,计数器值就减1;任什么时候刻计数器为0的对象就是不可能再被使用的。算法

                注:很难解决java问题中的对象之间的相互循环引用问题。线程

         根搜索算法: 经过一系列的名为“”GC Roots”的对象为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots 没有任何的引用链相连时,对象

               则证实此对象是不可用的。内存

               注:GC Roots对象分为:(1)虚拟机栈(栈帧中的本地变量表)中的引用的对象。虚拟机

                            (2)方法区中的静态属性引用的对象。效率

                            (3)方法区中常量引用的对象。基础

                            (4)本地方法栈中JNI(native方法)的引用的对象。变量

         引用:引用数据类型的值存储的是一块内存的起始地址,则表明着一种引用。搜索

            Java中将引用分为:强引用、软引用、弱引用、虚引用。

               强引用:只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

               软引用:系统将要发生内存溢出异常以前,将会把这些对象列进回收范围之中并进行第二次回收。

               弱引用:被弱引用关联的对象只能生存到下一次垃圾收集器发生以前。

               虚引用:一个对象是否有虚引用的存在,彻底不影响其生存时间,也没法经过虚引用来取得一个对象实例。

     方法区回收(永久代回收):废弃常量和无用的类。

                  废弃常量:当前系统没有任何地方引用这个常量,若是发生内存回收,有必要的话,会被系统清除常量池。

                  无用的类:(1)该类全部的实例都已经被回收,Java堆中不存在该类的任何实例。

                          (2)加载该类的ClassLoader已经被回收。

                       (3)该类的Java.lang.Class对象没有在任何地方被引用,没法经过反射访问该类的方法。

  垃圾收集算法: (1)标记-清除算法(最基础):分为标记和清除两个阶段,首先是标记出全部须要回收的对象,在标记完成后,统一回收掉全部被标记的对象。

                      缺点:(1)效率不高;

                         (2)空间问题:标记清除后,会产生大量不连续的内存碎片,可能会致使之后的程序须要分配较大对象时,没法找到足够的连续内存,

                                而触发垃圾收集动做。

           (2)复制算法:它将可用内存按容量分为了大小相等的两块,每次只使用其中的一块。当这一块的内存用完后,就将还存活着的对象复制到另外一块上去,

                  而后再把已使用的内存空间一次清理掉。

           (3)标记-整理算法:标记过程与标记-清除算法中的标记同样,而后让全部存活对象都向一端移动,最后直接清理端边界之外的内存。

           (4)分代收集算法:当代商业虚拟机都采用 “分代收集” 算法,根据对象的存活周期的不一样将内存划分为几块。将java堆分为新生代和老年代,而后就能够根据各个年代

                    的特色采用最适当的收集算法。

                    在新生代中,有大批的对象死亡,只有少数存活,采用复制算法;

                       在老年代中,对象存活率较高,故采用标记-清除或标记-整理算法。

   垃圾收集器分类:

          Serial收集器 :在JDK1.3以前是虚拟机新生代收集的惟一选择,这个收集器是最基础的、最悠久的收集器,这个收集器是单线程收集器。

                  Serial垃圾收集器在进行垃圾收集时,必须暂停其余全部的工做线程,直到它收集结束。

相关文章
相关标签/搜索