首页 > 试题广场 >

说说GC的可达性分析

GC中的可达性分析算法适用于判断对象是否存活。这个算法以根对象为起始节点,,根据引用关系向下搜寻,搜索所经过的路径就是“引用链”,如果一个对象没有任何引用链,就说明该对象不会再被使用,要被垃圾回收。常见的GCroot对象:方法区中的静态属性变量。所有堆中实例化对象。方法区中常量池引用对象
发表于 2022-06-23 11:24:33 回复(1)
可达性分析算法用于判断对象是否可以被回收,程序通过GC Roots中的对象为起点,以类之间的引用关系简历引用链,最终形成一个类似于数据结构中森林的一个结果,不存在与森林中的对象便是需要被回收的对象。这里的GC Roots主要包括线程栈中引用的变量,本地方法栈中引用的变量,方法区中的静态引用对象,常量池中的常量引用对象和被锁引用的对象。对一个对象真正的宣告回收需要经历两次标记过程,如果一个对象不再引用链上就会对它进行第一次标记,并判断它是否重新了finalize方法,若未重新或finalize方法已经被执行过了则会直接回收对象,否则会创建一个F-queue队列来存储这些对象,并启动一个低优先级的Finalizer线程去执行它们的finalize方法。第二次标记,稍后收集器会对队列中的对象进行可达性分析并标记,若仍然存在标记则表明该对象没有通过finalize方法实现自救则直接回收,否则对象复活。任何对象的finalize方法都只能被调用一次。
发表于 2022-07-25 11:34:14 回复(0)
可达性分析算法用于判断对象是否可以被回收,程序通过GCRoots中的对象为起点以类之间的引用关系建立引用链,最终形成一个类似于数据结构中森林的一个结果,不存在与森林中的对象便是需要被回收的对象。这里的GcRoots主要包括线程栈中引用的变量,本地方法栈中引用的变量,方法区中的静态引用对像,常量池中的常量引用对象和被锁引用的对象。对一个对象真正的宣告回收需要经历两次标记过程,如果一个对象不在引用链上就会对他进行第一次标记,并判断它是否重新了finalize方法,若未重写或finalize方法已经被执行过了则会直接回收对象,否则会创建一个F-queue队列来存储这些对象,并启动一个低优先级的Finalizer线程区执行它们的finalize方法。第二次标记,稍后收集器会对队列中的对象进行可达性分析并标记,若任然存在标记则表明该对象没有通过finalize方法实现自救则直接回收,否则对象复活。任何对象的finalize方法都只会被调用一次。
发表于 2022-05-18 16:36:50 回复(0)
gc可达性就是 根据可行性算法 判断对象是否存活 以跟对象为起始节点 根据引用关系向下搜索 搜索的路径就是 引用链 如果 一个对象 没有任何引用链 就被回收
发表于 2023-08-22 09:03:10 回复(0)
GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的".当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。 注:判断对象"不可达",一般有两种方法,即引用计数法和可达性分析法。 可达性分析:基本思想是通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
发表于 2023-08-01 14:43:47 回复(0)
可达性分析的目的是查找可回收对象,对GC roots作为根对象,利用引用关系进行向下查找,这一段路程被称为“引用链”,当对象没有任何引用链证明对象可以回收。常见的根对象为方法区的静态属性变量,方法区中常量池引用对象
发表于 2022-09-03 14:13:57 回复(0)
GC的可达性分析是判断对象是否存活的一种方法,通过GCRoots开始向下搜索,节点所走过的路径称为引用链,判断引用对象之间是否是可达的,解决了引用计数法之间对象相互引用无法被垃圾回收的问题 GCRoots有哪些: 活着的线程,系统类加载器加载的对象,被锁锁住的对象 引用线程栈帧中的方法参数、局部变量等 引用类中的静态变量
编辑于 2024-04-02 17:42:49 回复(0)
与GCRoot是否还有引用链 有,则不是垃圾,不回收 无,是垃圾,回收 GCRoot: 1、虚拟机栈中引用的对象 2、方法区中的静态变量和常量引用的对象
编辑于 2024-03-16 14:53:25 回复(0)
编辑于 2024-03-08 11:32:08 回复(0)
GC的可达性分析判断对象是否存活,以根对象为起始节点 根据引用关系向下搜寻 如果一个对象没有被引用 表示不会在使用 就会被回收
编辑于 2024-03-05 20:10:06 回复(0)
可达性分析算法用于判断对象是否可以被回收,程序通过GC Roots中的对象为起点,以类之间的引用关系简历引用链,最终形成一个类似于数据结构中森林的一个结果,不存在与森林中的对象便是需要被回收的对象。这里的GC Roots主要包括线程栈中引用的变量,本地方法栈中引用的变量,方法区中的静态引用对象,常量池中的常量引用对象和被锁引用的对象。对一个对象真正的宣告回收需要经历两次标记过程,如果一个对象不再引用链上就会对它进行第一次标记,并判断它是否重新了finalize方法,若未重新或finalize方法已经被执行过了则会直接回收对象,否则会创建一个F-queue队列来存储这些对象,并启动一个低优先级的Finalizer线程去执行它们的finalize方法。第二次标记,稍后收集器会对队列中的对象进行可达性分析并标记,若仍然存在标记则表明该对象没有通过finalize方法实现自救则直接回收,否则对象复活。任何对象的finalize方法都只能被调用一次
发表于 2023-07-19 15:42:33 回复(0)
垃圾回收的可达性分析是指从一组根对象出发,能否到达某个对象。在Java中,根对象包括:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI引用的对象。从这些根对象出发,能够到达的对象就是存活对象,不能到达的对象就是垃圾对象。Java中的垃圾回收器主要采用的是可达性分析算法,通过判断对象是否可达来判断是否为垃圾对象。
发表于 2023-03-26 16:40:30 回复(0)
可达性分析:是JVM用来判断对象是否存活的一种算法。同样的功能也可以使用引用计数器实现,在JVM中选择可达性分析实现。 可达性分析:指的是从GC Roots对象出发,遍历GC Roots对象的所有对象的引用,如果某个对象没有任何一条到GC Roots对象的引用链,就认为这个对象不可达,即可以回收的对象。 (不熟悉)GC Roots对象:1.在虚拟机栈中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。 2.在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量 3.在方法区中常量引用的对象,譬如字符串常量池里的引用; 4.在本地方法栈中引用的对象; 5.JVM内部的引用,如基本数据类型对应的Class对象,常驻的异常对象,以及系统类加载器; 6.所有被同步锁持有的对象; 7.反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。 引用计数器:指的是在一个对象的对象头中定义一个引用计数器,如果该对象新增了一个引用,则计数器++,如果该对象减少了一个引用,则计数器--,这个步骤看似简单, 实际上不是这样的。由于有循环引用问题,如 A-->B,B-->C,C-->A.这种情况会导致ABC都无法回收,所以如果需要使用引用计数器算法实现,就必须考虑这种情况,不让对象之间产生环。 当某个对象被判定为不可达对象时,其实也不是非死不可的。它有一次自救的机会,只要在finalliza()方法中重新和GC Roots对象之间建议引用关系即可,注意这个方法只会在对象回收时调用一次。 也就是说这次这个对象通过这个方法逃过了GC,下次就不会执行这个方法了。还有这个方法不是一定会执行的,JVM会创建一个低优先级的线程F-Queue线程去通知这些方法执行, 但是不会等这些方法执行完毕,即JVM不保证finalliza方法执行。所以在项目中禁止重写这个方法。JVM逻辑是:首先一个标记一个不可达对象,之后判断它是否重写的finalliza方法, 并且该对象没有执行这个方法,就会生成一个低优先级的线程去执行,只要在这个方法中重新连接上GC Roots对象,就可以让它逃过一个GC。
发表于 2023-03-22 18:30:19 回复(0)
50
发表于 2023-03-07 10:33:26 回复(0)
选择一个对象,通过引用的关系向下查找,能循环到的就是可能被引用的,游离的对象不可被引用的属于垃圾,会被清理
发表于 2022-12-05 16:26:20 回复(0)
m
发表于 2022-10-12 15:29:29 回复(0)
可达性分析算法来判定对象是否存活的。这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果GC Roots与某个对象间没有任何引用链相连,即这个对象不可达时,则说明这个对象是不可能再被使用,需要被回收。 真正宣告一个对象死亡,至少要经历两次标记过程: 1. 第一次标记 如果对象在进行可达性分析后发现是不可达的,那么就会进行第一次标记,随后进行一次筛选,筛选的条件是这个对象是否有必要执行finalize()方法。假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,那么虚拟机会视为“没有必要执行”。否则,该对象将会被放置在一个名为F-Queue的队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行它们的finalize()方法。 2. 第二次标记 垃圾收集器会对F-Queue中的对象进行第二次小规模的标记。如果对象能在finalize()方法中重新与引用链上的任何一个对象建立关联,那在第二次标记时它将被移出“即将回收”的集合。如果对象还是不可达的,那就会被回收。
发表于 2022-09-27 10:50:15 回复(0)
好,GC可达性分析算法主要用于判断对象是否存货。有一系列GC Roots 作为根对象,从这些根对象作为起始节点向下搜索,是用引用关系向下搜索的,所以搜索经过的路径被称为引用链。如果某个对象和GC ROOts 之间没有引用链,那么他就不可达,也就是不存活,不可能再被使用了。 虚拟机栈中引用的对象,方法去中类静态引用的对象等等
发表于 2022-08-11 23:30:21 回复(0)