其他分享
首页 > 其他分享> > GC

GC

作者:互联网

一、引用计数法
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不能再被使用的。引用计数法实现简单,判定效率也很高,但是它很难解决对象之间相互循环引用的问题。如下代码中 testGC()方法:对象objA和objB都有字段instance,赋值令objA.instance = objB;及objB.instance = objA;除此之外,两个对象再无引用,实际上这两个对象已经不可能再被访问,但是因为它们互相引用着对方,导致它们的引用计数都不为0,于是引用计数器无法通知GC收集器回收它们。

package test;
public class ReferenceCountingGC {
  public Object instance =null;
  private static final int _1MB=1024*1024;
  /**
   * 这个成员属性的唯一意义就是占点内存,以便能在GC日志中看清楚是否被回收过
   */
  private byte[] bigsize=new byte[2 * _1MB];
  public static void testGC() {
    ReferenceCountingGC objA = new ReferenceCountingGC();
    ReferenceCountingGC objB = new ReferenceCountingGC();
    objA.instance = objB;
    objB.instance = objA;
    
    objA = null;
    objB = null;
    //objA和objB是否能被回收?
    System.gc();
  }
}

 二、可达性分析算法

通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
在java语言中,可作为GC Roots的对象包括下面几种:
1、虚拟机栈(栈帧中的本地变量表)中引用的对象;
2、方法区中类静态属性引用的对象;
3、方法区中常量引用的对象;
4、本地方法栈中JNI(即一般所说的Native方法)引用的对象。

标签:对象,objA,instance,objB,GC,引用
来源: https://www.cnblogs.com/xidian2014/p/10468207.html