JVM中那些类可以作为GCRoot对象

一:jvm内存回收算法一般有两种

1、引用计数法:如果有地方引用该对象,该对象的引用计数就+1,如果引用失效的话就减一。计数器为0的对象不可以被使用。

2、可达性分析法:如果我们将一些GC Roots对象作为起始点,从这些节点向下搜索,搜索到的路径为引用链,如果有一些对象没有任何引用链相连,那么这个对象对于GC Roots是不可达的,即使它们之间可能相互产生关联,所以将其判定为可回收对象

          试想一下,如果有两个对象互相引用,比如objA.instance = objB, objB.instance = objB,这个时候两个对象都不能被访问,但是互相引用导致引用计数不为0,这不就无法判定为死亡了吗?我们如果是GC,能允许这种长生不死的存在吗?肯定不。所以引用计数法并没有被采用在目前的JVM垃圾回收器中。所以jvm使用的是可达性分析法算法

二:什么是可达性分析算法呢?

可达性分析算法:通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何引用链相连时或者该对象不是GCRoot对象时),则认为该对象不可达,后面该对象将会被垃圾收集器回收其所占的内存。

三:在java语言中,什么对象可作为GCRoot的对象?

    a. java虚拟机栈中的引用的对象。 

    b.方法区中的类静态属性引用的对象。 (一般指被static修饰的对象,加载类的时候就加载到内存中。)

    c.方法区中的常量引用的对象。 

    d.本地方法栈中的JNI(native方法)引用的对象

四:怎么理解上面4中类型的GCroot对象呢?

    a.java虚拟机栈中的引用的对象                                                                                                                                                              JVM中那些类可以作为GCRoot对象_第1张图片 

  b.方法区中的类静态属性引用的对象(一般指被static修饰的对象,加载类的时候就加载到内存中。)

       JVM中那些类可以作为GCRoot对象_第2张图片

c.方法区中的常量引用的对象

       JVM中那些类可以作为GCRoot对象_第3张图片

d.本地方法栈中的JNI(native方法)引用的对象

五:最后注意

   JVM中那些类可以作为GCRoot对象_第4张图片

六:方法区中的数据什么时候被回收

JVM中那些类可以作为GCRoot对象_第5张图片

你可能感兴趣的:(Jvm,GCRoot,jvm)