垃圾收集(GC):对一些死去的对象(即不可能再被任何途径使用的对象)进行回收。
所以垃圾收集器在对堆回收之前要先确定哪些对象已经“死去”,所以这时就需要我们去了解下面的垃圾收集算法:
(1)引用计数算法
引用计数算法:给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器值都为0的对象就是不可能再被使用的。
优点:实现简单,判断效率高
缺点:很难解决对象之间的相互循环引用的问题。
(2)根搜索算法
(Java和C#都是使用根搜索算法判定对象是否存活的。)
根搜索算法:通过一系列的名为“GC Roots”的对象作为起始点,从这些结点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。如图,object5/6/7虽然相互有关联,但是它们到GC Roots是不可到达的,所以它们将会被判定为是可回收对象。
在Java语言中,可作为GC Roots的对象包括以下几种:
根搜索算法判定对象是否可回收1.虚拟机栈(栈帧中的本地变量表)中的引用的对象。
2.方法区中类静态属性引用的对象
3.方法区中的常量引用的对象
4.本地方法栈中JNI(即一般说的native方法)的引用的对象
网友评论