轻松搞定java内存模型(二)判断对象是否应该被回收
上一篇我们介绍完了类的整个加载过程,这样我们写好的类就可以在虚拟机中发光发热了,那我们该怎么判断,我们创建的对象在虚拟机中什么时候该被回收,释放自己占用的内存呢?
1:引用计数法
给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象是不可能被使用的。也就是需要被清除的对象。
引用计数法实现简单,判定效率也高,但是在虚拟机中却很少真的被应用,主要是因为引用计数法很难解决对象之间相互循环引用的问题。
例如:
对象A和对象B互相引用,两个对象的引用计数器的数值都是1,但是其实两个对象都已经没有用,应该被清除。
2:可达性分析法
可达性分析法基本思路就是通过一系列的成为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,(其中的路径叫做引用链),当一个对象到GC Roots没有任何引用链,则证明此对象是不可用的。
可达性分析是最常用的分析对象是否可用的算法,Hotspot虚拟机就是使用的这个算法。
如下图,就是当从GC Roots到某个对象不可达的时候,这个对象不可用。
Java语言中的GC Roots:
1:在虚拟机栈中的引用对象
2:在方法区中的静态属性引用的对象
3:在方法区中常量引用的对象
4:在本地方法区中引用的对象。
经过前几篇的介绍我们了解了一个类如何被加载被使用,然后在本节又了解了虚拟机到底是如何来判断一个对象是如何被判定是否应该继续存在的,那么下篇我们就来好好谈谈,最最关键的GC,看看jvm的垃圾回收如何完成。