对于JVM的垃圾收集(GC),这是一个作为Java开发者必须了解的内容,那么,我们需要去了解哪些内容呢,其实,GC主要是解决下面的三个问题:
-
哪些内存需要回收?
-
什么时候回收?
-
如何回收?
回答了这三个问题,也就对于GC算法的原理有了最基本的了解。
1 如何判定哪些内存需要回收
在Java虚拟机的堆中会存放着很多的对象,那么,我们需要回收垃圾的时候,是通过什么算法来判断哪些垃圾的生命周期已到,需要回收呢?接下来的几种算法将帮助你解决这几个问题。
引用计数算法
先讲讲第一个算法:引用计数算法。
其实,这个算法的思想非常的简单,一句话就是:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1;任何时刻计数器为0的对象就是不可能再被使用的。
这些简单的算法现在是否还被大量的使用呢,其实,现在用的已经不多,没有被使用的最主要的原因是他有一个很大的缺点:很难解决对象之间循环引用的问题。
循环引用:当A有B的引用,B又有A的引用的时候,这个时候,即使A和B对象都为null,这个时候,引用计数算法也不会将他们进行垃圾回收。
public class Test_02 {
public static void main(String[] args) {
Instance instanceA = new Instance();
Instance instanceB = new Instance();
instanceA.instance = instanceB;
instanceB.instance = instanceA;
instanceA = null;
instanceB = null;
System.gc();
Scanner scanner = new Scanner(System.in);
scanner.next();
}
}
class Instance{
public Object instance = null;
}
如果使用的是引用计数算法,这是不能被回收的,当然,现在的JVM是可以被回收的。
可达性分析算法
这个算法的思想也是很简单的,这里有一个概念叫做可达性分析,如果知道图的数据结构,这里可以把每一个对象当做图中的一个节点,我们把一个节点叫做GC Roots,如果一个节点到GC Roots没有任何的相连的路径,那么就说明这个节点不可达,也就是这个节点可以被回收。
上面图中,虽然obj7、8、9相互引用,但是到GC Roots不可达,所以,这种对象也是会被当做垃圾收集的。
在Java中,可以作为GC Roots的对象包括以下几种:


最低0.47元/天 解锁文章
13万+

被折叠的 条评论
为什么被折叠?



