1.判断对象是否存活算法:

    引用计数算法:

         --给对象添加一个引用计数器,每当有一个地方引用时计数器加1,当引用失效时计数器减1。计数器为0时对象不再被使用。

         --缺点:难以解决对象之间互相循环引用的情况

              eg:objA.instance = objB;

                     objB.instance = objA;

                   除此之外无其他引用,此时因为他们互相引用着对方,所以计数器不为0,但是其实是可以回收的。

         Java并不是通过引用计数算法判断对象是否存活的。

 

    可达性分析算法(Java, C#):

         -- 通过一系列称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,证明此对象不可用,为可回收

         eg:Object5,Object6,Object7判定可回收对象,Object1, Object2, Object3, Object4为仍然存活的对象

     可达性分析算法.png

         -- 在Java语言中,可作为GC Roots的对象包括:

              虚拟机栈(栈帧中的本地变量表)中的引用对象

              方法区中类静态熟悉引用的对象

              方法区中常量引用的对象

              本地方法栈中JNI(即Native方法)引用的对象


2.引用

    强引用(Strong Reference)

        代码中普遍存在的。类似Object obj = new Object()的这类引用

    软引用(Soft Reference)

        用来描述一些还有用但并非必须的对象。对于软引用关联的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。

    弱引用(Weak Reference)

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

    虚引用(Phantom Reference)

        为对象设置虚拟引用的唯一目的时能在这个对象被收集器回收时收到一个系统通知。