对于验证对象是否为垃圾对象的算法,有两种,一种是引用计数法,另一种是可达性分析法
,我们上一节已经对引用计数法做了一个详细的介绍,本节课来了解一下可达性分析法,我们知道,引用计数法存在一个非常大的问题,就是说,
当对象进行循环引用的时候,它就不能分析出来这个对象是否为垃圾对象
,虽然它具有简单性和灵活性,但是我们一般情况下来讲,是不采用引用计数法的,通过上一节的例子也给大家说明了,那么,另外一种就是可达性分析法,那么,这种方法虽然相比较引用计数法,要复杂一些,但是,它的执行的效率包括功能来讲,它是非常强大的,它可以解决我们上一节讲的引用计数法所不能完成的任务,我们先说一下可达性分析法是一个怎么样的思路。

首先,它定义一个叫做垃圾回收的根节点,比如说,同样的还是一块堆内存,一块栈内存, 两块区域,当然了,我们这里所说的栈,我们
默认说的虚拟机栈就是指的虚拟机栈帧中的局部变量表,比如所以它为gc root



我们创建一个对象,那么,堆内存中有一块区域给它引用



然后,堆内存中的这个对象里面也有一堆的引用



所谓的可达性分析法,就是通过GC root(即垃圾回收的根节点),往下走,能走到的对象,说明这个对象是可用的,然后,在通过走到的这个对象往下走,以此类推



显然,走不到它,所以,这一块区域就被标记为垃圾对象,就被回收掉了。比如说,我们把这根引用给断掉



也就是说,从GC ROOT上,直接把



给断掉了,那么,我们发现,



这一大块区域都是从GC ROOT上找不到它们了,找不到它们就认为它们是垃圾,所以直接就把这一整块内存给回收掉了。这就是关于可达性分析算法的思路,就是定义GC
ROOT,然后从GC ROOT一直往下找,如果能找的到这个对象,说明被找到的这个对象是活着的,如果找不到这个对象,说明这个对象就可以被回收了
。用官方的话说,比较专业的话说就是,从GC ROOT这个节点向下搜索,它所走过的路径,这个路径称之为引用链,那么,当一个对象对GC
ROOT这个节点没有任何引用链相连接的时候,那么,就认为这个对象是不可用的,这就是可达性分析算法。

下面,我们主要的关注点就到了GC ROOT上面,那么,哪些地方可以作为GC ROOT来进行向下去查找呢?其中第一个就是我们所说的,虚拟机栈
,我们这里所说的虚拟机栈就是栈帧中的局部变量表,我们只要不说,就是默认虚拟机栈就是指虚拟机栈帧中的局部变量表。第二个就是方法区的类属性所引用的对象,第三个是,
方法区中常量所引用的对象,第四个是,本地方法栈中引用的对象,那么,这些中的对象,它都可以作为GC ROOT 的起点
,向下去进行一级一级的去查找,只要是在这些地方所找不到的,那么,那个对象就被认为是不可用的,那么就会对他进行回收。



目前主流的垃圾回收器所采用的判定垃圾对象的算法基本上都是可达性分析算法。关于可达性分析算法就说到这里。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信