精华内容
下载资源
问答
  • GC 可达性分析算法

    千次阅读 2018-11-07 19:27:13
    在主流的商用程序语言的主要实现中,都是称通过可达性分析(Reachability Analysis)来判定对象是否存活的,这个算法的基本思路就是通过一系列的称为“GC Roots“的对象作为起始点,从这些节点开始向下搜索,搜索所...

    在主流的商用程序语言的主要实现中,都是称通过可达性分析(Reachability Analysis)来判定对象是否存活的,这个算法的基本思路就是通过一系列的称为“GC Roots“的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路程成为引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。

    在Java语言中,可作为 GC Roots 的对象包括下面几种:

    • 虚拟机栈(栈帧中的局部变量表)中引用的对象。(即Java方法中局部变量引用的对象)
    • 方法区中类静态属性引用的对象。(即类的静态变量引用的对象)
    • 方法区中常量引用的对象。(即类的常量引用的对象)
    • 本地方法栈中 JNI 引用的对象。(即 Native 方法中局部变量引用的对象)

     

    虚拟机栈:

    虚拟机栈的生命周期与线程相同,是线程私有的。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用到执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

     

    方法区:

    方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

     

    本地方法栈:

    本地方法栈与虚拟机栈所发挥的作用是相似的,他们之间的区别在于虚拟机栈为虚拟机执行 Java 方法服务,而本地方法栈则为虚拟机使用到的 Native 方法服务(说白了,就是在虚拟机执行 Native 方法时,用来保存 Native 方法内的局部变量等信息)。

     

     

     


    有一个疑问:为什么Java类的普通变量不能作为 GC Roots 的对象?

    在对虚拟机整体有一个大致了解之后,这个问题有了答案:所有通过 new 关键字创建的对象全部保存到 Java堆,而对对象的引用几乎全部位于虚拟机栈中,这样就能通过虚拟机栈的局部变量表找到该对象,若该对象的普通成员变量又引用了另外一个对象,这仍然是一条完整的 GC Roots 引用链。

     

     

    展开全文
  • GC 可达性分析

    2021-03-06 00:06:24
    可达性分析GC roots开始作为七点,向下搜索他们引用的对象,可以生成一棵引用树。所有树的节点被称为可达的节点,否则就是不可达的节点 在Java语言中,可以作为GC roots的对象包含以下的几种 虚拟机栈中的引用...

    可达性分析

    从GC roots开始作为七点,向下搜索他们引用的对象,可以生成一棵引用树。所有树的节点被称为可达的节点,否则就是不可达的节点

    在Java语言中,可以作为GC roots的对象包含以下的几种

    • 虚拟机栈中的引用对象
    • 方法区中的类静态属性引用的对象
    • 方法区中的常量引用的对象
    • 本地方法栈中的native方法的引用对象
    展开全文
  • 首先那肯定还得是看看概念了,在JVM中,什么可以作为GC Root呢? 虚拟机栈(栈帧中的本地变量表)中引用的对象。  方法区中类静态属性引用的对象。 方法区中常量引用的对象。 本地方法栈中JNI(即一般说的...

    首先那肯定还得是看看概念了,在JVM中,什么可以作为GC Root呢?

    • 虚拟机栈(栈帧中的本地变量表)中引用的对象。  
    • 方法区中类静态属性引用的对象。
    • 方法区中常量引用的对象。
    • 本地方法栈中JNI(即一般说的Native方法)引用的对象。
    class v {
      b,c
    }
    
    class b{
      d
    }
    
    class d{
      c
    }
    
    class c{
      b
    }
    
    1. fun(...){
    2. v a = new A;
    3. a.b = new B;
    4. a.c = new C;
    5. a.b.d = new D;
    6. a.b.d.c = a.c;
    7. a.c.b = a.b;
    8. a.c = null;
    9. a.b = null;
    10. ...............
    100. }
    • 接下来我会画图解释如上代码:

     

     

     此时可以理解为,针对对象A(GC ROOT根),BCD对象不可达。

     

     

     

    • 咱们口中常说的垃圾回收啊,都在红圈区域,即是回收我们用new,分配在堆中的对象;
    • 而常量、全局变量、静态变量、以及帧栈中的局部变量,都是存储在蓝圈区域的

     

     

     

    • 小结:

    1》通常情况下,堆中的对象可以通过方法区中静态变量、常量、全局变量以及帧栈中的局部变量直接或间接引用访问;

    2》但是如果堆中的对象,没有任何引用可以直接或间接访问的话,这个对象就是可以被回收的,所以我们也可以为非堆区域内变量及时赋NULL,以减少【minor gc】频率。

    展开全文
  • 为了解决这个问题,就有了可达性分析回收算法。 可达性分析: 算法中定义了几个GC Root对象,这几个root对象在GC时不会被JVM回收掉,然后通过这些对象像树枝一样向外延伸,被引用到的对象说明还存活使用,就不会被GC...

    JVM有一个回收算法是引用计数算法,每当对象被引用一次,就+1,释放一个引用就-1,当垃圾回收时,引用计数为0的对象就会被GC掉。但这个方法有个问题,就是无法解决循环引用的问题。

    循环引用就是对象A引用了对象B,对象B引用了对象A,构成了一个引用环。彼此都没发挥什么作用,但却不会被GC。为了解决这个问题,就有了可达性分析回收算法。

    可达性分析:

    算法中定义了几个GC Root对象,这几个root对象在GC时不会被JVM回收掉,然后通过这些对象像树枝一样向外延伸,被引用到的对象说明还存活使用,就不会被GC,没有被这些root对象引用到的就会被GC掉。从而解决了循环引用问题。

    Root对象主要包括:

    ①系统类加载器(bootstrap)加载的类。

    ②JVM方法区中静态属性引用的对象。

    ③JVM常量池中引用的对象。

    ④JVM虚拟机栈中引用的对象。

    ⑤JVM本地方法栈中引用的对象。

    ⑥活动着的线程。

    官方解释:

    GC roots
    
    The so-called GC (Garbage Collector) roots are objects special for garbage collector. Garbage collector collects those objects that are not GC roots and are not accessible by references from GC roots.
    
    There are several kinds of GC roots. One object can belong to more than one kind of root. The root kinds are:
    
    Class - class loaded by system class loader. Such classes can never be unloaded. They can hold objects via static fields. Please note that classes loaded by custom class loaders are not roots, unless corresponding instances of java.lang.Class happen to be roots of other kind(s).
    Thread - live thread
    Stack Local - local variable or parameter of Java method
    JNI Local - local variable or parameter of JNI method
    JNI Global - global JNI reference
    Monitor Used - objects used as a monitor for synchronization
    Held by JVM - objects held from garbage collection by JVM for its purposes. Actually the list of such objects depends on JVM implementation. Possible known cases are: the system class loader, a few important exception classes which the JVM knows about, a few pre-allocated objects for exception handling, and custom class loaders when they are in the process of loading classes. Unfortunately, JVM provides absolutely no additional detail for such objects. Thus it is up to the analyst to decide to which case a certain "Held by JVM" belongs
     
    

    强引用:

    强引用就是引用了通过new 的方式创建的对象。在root搜索算法的里面,说的引用都指的是强引用关系。

    Object obj = new Object();
    obj这个变量引用了一个object对象,只有obj这个引用被释放了,对象才会被GC。

    比如

    obj=null;
    这样对象就会被释放。

    软引用:

    软引用的对象只有在内存不足的时候才会被回收掉,如果GC时,内存充足,那么软引用类型不会被回收。

    软引用的作用是:软引用可用来实现内存敏感的高速缓存。如果内存充足,就可以一直把缓存放在内存中,加快数据访问速度。如果内存不足了,缓存就会被回收掉。

    Object obj = new Object();
    SoftReference softReference = new SoftReference<>(obj);

    弱引用:

    弱引用只会生存很短的时间,在第一次经历GC时,无论内存是否充足,都会被回收掉。

    弱引用的作用就是:如果一个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么就可以将对象修饰为为弱引用类型。弱引用还可以用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。还有一种情况:当你想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候就可以用弱引用。

    Object obj = new Object();
    WeakReference weakReference = new WeakReference(obj);

    虚引用:

    虚引用就是假的引用,如果一个对象与虚引用关联, 则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。虚引用必须配合引用队列使用。

    虚引用的作用:因为虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时, 如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。所以程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。 如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    Object obj = new Object();
    ReferenceQueue queue = new ReferenceQueue();
    PhantomReference pf = new PhantomReference(obj,queue);

    展开全文
  • JVM有一个回收算法是引用计数算法,每当对象被引用一次,就+1,释放一个引用就-1,当垃圾回收时,引用计数...为了解决这个问题,就有了可达性分析回收算法。 可达性分析: 算法中定义了几个GC Root对象,这几个ro...
  • 为了解决引用计数法的循环引用个问题,Java使用了可达性分析的方法: 所谓 GC Roots 或者说 Tracing Roots的“根集合” 就是一组必须活跃的引用 基本思路就是通过一系列名为 GC Roots的对象作为起始点,从这个被...
  • GC用的引用可达性分析算法中,哪些对象可作为GC Roots对象?
  • 《深入理解JVM》原文:在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的。这个算法的基本思路就是通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径...
  • 在面试中,JDK和JRE的区别,字节码的优势,GC垃圾回收器,这些都是会被经常问到的问题,那么你对这些问题有多少了解呢,能答出来多少呢,如果不能快速答出,或者没有明确的答案,那么在看完本篇博客后,相信你会有所...
  • GC:可达性分析算法

    千次阅读 2020-02-20 21:27:55
    可达性分析算法之前有一个叫引用计数法,原理非常简单如果一个对象没有任何引用与之关联,基本上对象不可能在其他地方用的上,这个对象就成为可被回收的对象,但是这个方法虽然非常简单,而且高效,但是它无法解决...
  • JAVA垃圾回收-可达性分析算法

    万次阅读 多人点赞 2018-08-05 15:31:54
     标记的前提是对象在进行可达性分析后发现没有与GC Roots相连接的引用链。  1).第一次标记并进行一次筛选。  筛选的条件是此对象是否有必要执行finalize()方法。  当对象没有覆盖finalize方法,或者finzlize...
  • JVM的垃圾回收对于Java开发人员来说是比较透明的,...答:判定的算法有两种:引用计数法和可达性分析算法。引用计数法:给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就+1,;当引用失效时,计数器...
  • 先说一下可达性分析算法的思想:从一个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。 在java中可以作为GC Roots的对象有以下几种: 虚拟机栈中引用的对象...
  • GC Roots可达性分析以及GC Roots的对象

    千次阅读 2019-06-09 16:57:49
    可达性分析算法的基本思路就是通过一系列称为“GC Roots”的对象作为起点,从这些结点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(就是从GC Roots到这...
  • 在Java语言中,可作为GC Roots的对象包括下面几种: 1. 虚拟机栈(栈帧中的本地变量表)中引用的对象。 2. 方法区中类静态属性引用的对象。 3. 方法区中常量引用的对象。 4. 本地方法栈中JNI(即一般说的Native...
  • 点击上方蓝字关注我们上文:JVM (标记-清除算法、复制算法、标记-整理算法、分代收集算法、分区算法)可达性分析是什么?可达性分析是用来判断对象是否存活,通过"GC Roo...
  • 原文中 “其他线程可能会更新已经访问过的对象中的引用”,这里已经访问过的对象,应该指的是已经被GC 回收器根据可达性分析算法标记过(标记成存活或者死亡)的对象。 然后误报跟漏报的场景,也没有讲清楚,我理了...
  • 可达性分析算法: (当前主流语言的内存管理子系统都是通过可达性分析算法来判断对象是否存活,Java语言同样,没有使用引用计数法算法的) 基本思路:GC roots的对象作为起始节点集合,从这些节点开始,根据引用...
  • JVM垃圾回收机制 垃圾回收执行过程 对象优先被分配到Eden区中 大多数情况下,被创建的对象被分配到Eden区中,当Eden区没有足够的空间分配给另外的...老年代GC(Major GC/Full GC) 发生在老年代的垃圾回收动作都叫Full G
  • 可达性分析算法,可达性分析算法最重要的就是要先知道哪些对象死了,怎么知道对象已经死了呢,就要找到GCRoot对象,然后顺着引用路径一直找下去,如果GCRoot下面没有对象引用链,那么这些对象就可以认为是濒临死亡...
  • 可达性分析算法

    2021-07-21 18:54:27
    可达性分析算法:也可以称为根搜索算法、追踪性垃圾收集。 相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题,防止...
  • 目录垃圾回收回收哪?回收谁?怎么断定对象已死?引用计数法可达性分析算法可达性分析算法的实现GC Roots的标记和存储GC Roots遍历前GC Roots遍历前前GC Roots遍历中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,987
精华内容 9,594
关键字:

gc可达性分析