如何判断对象是否存活之根搜索算法

博客围绕判断对象是否存活展开,重点介绍根搜索算法。该算法在信息技术领域用于确定对象的存活状态,对内存管理等方面有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根搜索算法有没有人了解过的,在垃圾回收机制里面判断对象存活,主要是使用根搜索算法进行实现的,根搜索算法可能

稍微有点抽象,算法是怎么进行实现的,又叫GCRoots,类似于树形结构一样的,他怎么样进行实现出来的,GC Roots到底是

什么目的,他其实是判断是否有依赖关系,如果你没有和GC Roots做引用关系的话,我认为是不可达对象的,就会被垃圾回收

进制给回收掉的,判断是否可达,是通过什么原理实现的呢,需要和根节点有依赖关系,如果没有和我的GC Roots没有任何的

引用的情况下,这个就是不可达对象了,这个时候GC就会认为是不可达对象,怎么样才判断可达呢,就是你的对象要和我的GCRoots

要形成一个关联,必须要和我的GC ROOTS要有引用的情况下,这个时候GC就会认为是可达对象,一定要和GC ROOTS产生关联,

如果没有关联的情况下是一个不可达对象,就会给垃圾回收机制给回收掉,GC ROOTS到底是做什么的比较绕,GC ROOTS其实相当于

使用栈,还有方法区的类静态属性引用对象,包括方法区的常量引用对象,还有JNI native方法引用的对象,比如我现在来一个对象

叫user1,我这边再来个对象叫user2,这里又user1和user2对象,user1和user2之间没有任何关系,user1和user2都引用到GC ROOTS,

比如这个时候再来一个对象,叫做user3,user3他去引用到一个user1,这个时候也有一个可达对象,他底层怎么做的,从GC ROOTS去

遍历出来,找到下面的子节点,如果有任何关联的话,都会认为是可达对象的,如果遍历GC ROOTS,如果没有任何依赖的情况下,

没有和我GC ROOTS有任何依赖的情况下,那么这个时候就会认为是不可达对象的,这个时候有这个场景,这个场景用的还是比较多的

我来一个对象叫做user5,我再copy一个,叫做user6,然后我再来一下user7,user6和user7有依赖关系,user5和user6,user7会不会

来及回收进制回收掉呢,user5创建好了之后,没有被任何引用,user6又被user7被引用的情况下,因为这个时候没有GC ROOTS引用的

情况下,就会被垃圾回收机制给回收掉,因为它没有GC ROOTS这个根节点,那么我们再反过来说,什么是GC ROOTS,GC ROOTS相当于他是

怎么来的,这个时候只要你有一个虚拟的栈,你只要有这样的一个局部变量,能够去引用对象,或者是方法区的引用对象,或者是方法区

常量引用对象,方法区JNI native方法引用对象

这个图其实还是很难描述GC ROOTS原理,在这里我又画个图你就知道GC ROOTS的原理了,在这里我画一个非常详细的图你们就知道他们

的原理了在这里我们举个例子,方法区主要是存放一个静态信息,那我来问一下你们,方法区能不能做一个GC ROOTS,方法区肯定能的,

只要你和GC ROOTS进行关联起来,这个时候垃圾回收机制就会认为有可达对象了,我们这里再来一个堆内存,你知道我们的对象都是

在堆内存里面的,然后我们再来一个虚拟机栈,我们可以把他叫做虚拟机栈,就叫栈吧,我们这里还有一个本地方法栈,比如这个时候

我们方法去在虚拟栈里面,然后我们栈在GC ROOTS,这个时候我的堆里面有这么几个对象,有哪几个对象呢,比如第一个对象我们把

他叫做user1,user1方法区里面是谁在引用他呢,是被方法区引用到了,这个时候我们再有一个对象叫做user2,user2被虚拟机栈引用,

然后我们还有一个user3,user3没有任何依赖关系,我们再来一个user5,user5去依赖user3,我把图画完了之后你们就知道什么意思了,

接着我又来一个对象叫做user4,user4可能会被本地方法栈所依赖到,那我就把箭头给你画好点,然后我再来一个user6,user6引用到了

user4的情况下,这个时候我来问你们,垃圾回收机制,首先方法区,虚拟机栈,本地方法区,都可以做为一个GC ROOTS,只要你能够被

别人引用到的话,只要把GC ROOTS作为一个节点,找到这样的一个依赖关系的情况下,是可达的,垃圾回收机制是不会被回收掉的,

如果没有和GC ROOTS做关联的情况下,我就会认为是垃圾回收对象,会被回收掉的,这个时候你们可以想一下,1,2,3,4,5,6哪些

对象可达,哪些对象是不可达的,1,2,4,6首先是可达对象的,但是3和5你们有一个误区,3和5不是也有依赖关系吗,他确实有依赖关系,

但是3和5没有和GC ROOTS做关联,我GC ROOT遍历的时候,我可能认为找不到你,我就认为是不可达的对象,因为它没有GC ROOTS,

这就是根搜索算法,这就是可达性算法,这个图是我自己原创出来的

因为这个图理解起来比较绕,主要是让大家能够理解起来,根搜索算法的基本思想就是使用GC ROOTS作为起点,从这个起点

开始往下搜索,如果没有找到任何相关联的话,我就认为此对象就是不可达对象的,要是如果你们相互引用的情况下,就是有

关联的情况下,我就认为是可达对象,GC ROOTS其实我们可以认为是被引用对象,这样理解就行了,像我们刚才说的方法区,

虚拟机栈,本地栈,都是GC ROOTS的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值