判断对象存活算法

判断对象存活算法

垃圾收集器对堆进行回收前,第一件事就是要确定这些对象哪些还“存活”,哪些已经“死去”

引用计数算法

概念:给对象添加一个引用计数器,每当有一个地方引用他时就加1,当引用失效时,计数器就减1,任何时刻计数器都为0的对象就是不能被使用的

Java没有使用该算法来管理内存,主要原因是它很难解决对象之间的项目循环引用问题。

    TestLoopReference a = new TestLoopReference();
    TestLoopReference b = new TestLoopReference();
    a.instance = b;
    b.instance = a;

    a = null;
    b = null;

这两个对象已经不能再被访问,但实际上各自维护着对方的对象导致引用计数不为0,导致引用计数算法无法通知GC去回收他们。

根搜索算法

通过一系列的“GCRoots”的对象作为起始点,从这些节点开始往下搜索,搜索的走过的路径称为引用链,当一个对象到“GC Roots”没有引用链可达时(也就是用图论的话说就是从GC Roots到这个对象不可达),则证明此对象是不可用的,这样的对象被判定为是可回收的。

在Java中可作为GC Roots的对象包括下面几种:

  • 虚拟机栈(栈帧中的本地变量表)中的引用对象
  • 方法区中的类静态属性引用对象
  • 方法区中的常量引用对象
  • 本地方法栈中JNI的引用对象

猜你喜欢

转载自blog.csdn.net/AshinLi/article/details/81779690