java如何判断对象已死

在堆里存放着java世界中几乎所有对象实例,垃圾收集器在对堆进行回收前,第一件事就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”。

引用计数算法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器就增加1;当引用失效时,计数器就减1;任何时刻计数器为0时对象就是不可能在被使用的。

可观的说引用计数器的实现简单,判定效率也很高,在大部分情况下他都是一个不错的算法,但是主流的java虚拟机都没有选用引用计数器算法来管理内存,主要的原因是他很难理解对象之间的循环引用问题。

举个例子,对象obj1和obj2都有对方的引用,除此之外两个对象再无任何其他引用,实际上两个对象已经不可能被访问,但是因为他们互相引用着对方,导致他们的引用计数器不为0,于是引用计数算法无法通知GC收集器回收他们,具体如下代码:

public class RefCountGC {

        public Object instance = null;

        public static void test() {

              RefCountGC obj1 = new RefCountGC();

              RefCountGC obj2 = new RefCountGC();

              obj1.instance = obj2;

              obj2.instance = obj1;

              obj1 = null;

              obj2 = null;  

        }

}

可达性分析算法

java中(包括很多主流程序语言如C#)的主流实现中都是通过可达性分析来判断对象是否存活。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots 没有任何引用链相连时,则证明此对象是不可用的。


可达性分析算法判定对象是否可回收

在java语言中,可作为GC Roots的对象包括下面几种:

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

2、方法区中类竞态属性引用的对象

3、方法区中常量引用的对象

4、本地方法栈中JNI(即一般说的native方法)引用的对象

你可能感兴趣的:(java如何判断对象已死)