首页 > 试题广场 >

怎么判断哪些对象是可以删除的,可达是什么意思

[问答题]
请问怎么判断哪些对象是可以删除的,可达是什么意思
这块其实就考gc的入门知识,既然java都是通过jvm来管理内存,那么怎么判定一个对象是否要被垃圾回收呢。简单来说,判定一个对象是否要被回收有俩个方法:引用计数法和可达性分析法。
首先说引用计数法,
在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值+1,当引用失效的时候,计数器的值-1
这个就带来了一个问题,万一俩个对象是在堆内互相引用,那么外部中断,并不会影响内部,这个对象事实上已经用不到了,那么就会白白占着内存,这样不就内存泄漏了么。所以我们引入了可达性分析法,简单来说就是从gcroot入口有个引用链,如果堆内一个对象没有跟任何引用链关联的话,就被视为需要被垃圾回收的对象。说的直白点就是,从堆外出发,类似于链表或者树一样,如果有一个堆内的对象不能顺着这个链表或者树节点走到最初的根节点则视为对象不可达。
发表于 2018-12-19 10:04:15 回复(1)
引用计数法和可达性分析,对象每次被引用的时候,引用计数就会+1,当放弃引用时,引用计数就会-1,当对象的引用计数为0时,表明此对象可被回收,而可达性分析是避免多个已失效的对象相互引用,造成内存泄露
编辑于 2019-02-24 14:03:59 回复(2)
详解:
1、引用计数法:一个对象有一个计数器,当这个对象被引用时计数器+1,当这个引用失效的时候计数器-1,当计数器为0时这个对象被回收;但可能存在两个对象互相引用造成死链,实际上这个对象没有用了,但是因为有引用关系而不能把这个对象清除掉,造成内存泄漏。
2、可达性分析:通过一系列为GCRoot的对象作为起点向下搜索,搜索所走的路径称为引用链,当一个对象和任何引用链都没有关联的时候,这个对象会被标记筛选,判断这个对象是否覆写了finalize方法,没有覆写直接回收,否则,如果没有执行finalize,这个对象会被放到一个队列中,虚拟机会自动创建一个优先级低的线程去执行队列中对象的finalize方法,之后在进行判断是否可达,可达则复活,不可达回收。(注:可做为GCRoot的对象,1虚拟机栈中(操作栈的局部变量表)引用的对象、2方法区中静态变量引用的对象、3方法区中常量引用的对象、4本地方法栈中引用的对象)
发表于 2019-07-07 21:26:59 回复(0)
可以用引用计数法,可达性算法判断一个对象是否可以回收,一般使用后者,因为前置在存在循环引用时有问题。可达是从gcroot开始遍历,能找到的对象则是可达的,不能找到的对象则是不可达的
发表于 2019-03-15 19:57:32 回复(0)
使用引用计数法和对象可达法:引用计数法:引用被使用一次就+1,失去引用就-1,当计数为0的时候就回收。对象可达法是:沿着gcroot寻找,如果没有找到就回收
发表于 2019-05-08 22:11:50 回复(0)
主要有两种方法,引用计数法,方法简单快速,但是不能解决循环引用的情况,另一种是可达性分析,是否有到达gcRoot的引用链,gcRoot包含:栈中引用的对象,静态属性的对象,方法区常量的对象,本地方法栈中JIN引用的对象
发表于 2019-05-06 18:36:22 回复(0)
可以用引用计数法,可达性算法判断一个对象是否可以回收,一般使用后者,因为前置在存在循环引用时有问题。可达是从gcroot开始遍历,能找到的对象则是可达的,不能找到的对象则是不可达的
发表于 2019-05-05 09:36:42 回复(0)
判断方法有两种,一种是引用计数器,给对象添加一个引用计数器,每当有一个地方引用他时,计数器就加一,引用失败计数器减一,计数器为零的对象就不可能再被使用, 第二种方法是可达性分析算法。这个算法的基本思路就是通过一系列的称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连的时候,则证明此对象是不可用的。否则即是可达的。在java语言中,可作为GC Roots的对象包括下面几种:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象和本地方法栈中JNI(一般说的Native方法)引用的对象。
发表于 2019-04-25 17:58:22 回复(0)
不再使用的对象
发表于 2019-04-25 17:46:07 回复(0)
判断方法有两种,一种是引用计数器,给对象添加一个引用计数器,每当有一个地方引用他时,计数器就加一,引用失败计数器减一,计数器为零的对象就不可能再被使用, 第二种方法是可达性分析算法。这个算法的基本思路就是通过一系列的称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连的时候,则证明此对象是不可用的。否则即是可达的。在java语言中,可作为GC Roots的对象包括下面几种:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象和本地方法栈中JNI(一般说的Native方法)引用的对象。
发表于 2019-04-25 14:30:24 回复(0)
可达性算法,gcroot开始,不能够达到的对象,判断可以被回收
发表于 2019-03-23 21:32:09 回复(0)
gc判断java对象是否可回收: 引用计数法和可达性分析法 可达性分析法: 是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
发表于 2019-03-18 00:32:01 回复(0)
不可达的对象是可以删除的
发表于 2019-03-16 20:02:46 回复(0)
引用记数法 可达性分析
发表于 2019-02-18 10:58:10 回复(0)
引用记数法,可达性分析
发表于 2019-01-15 19:32:29 回复(0)