乐趣区

关于jvm:什么是GC-Roots

可达性算法中以 GC Root 对象为终点开始搜寻。

什么是 GC Root 对象

虚拟机栈中援用的对象

public class Rumenz{public static  void main(String[] args) {Rumenz a = new Rumenz();
         a = null;
    }

}

a 是栈帧中的本地变量,a 就是 GC Root, 因为a=null,a 与new Rumenz() 对象断开了链接, 所以对象会被回收。

办法区类的动态成员援用的对象

public class Rumenz{
    public static Rumenz=r;
    public static void main(String[] args){Rumenz a=new Rumenz();
       a.r=new Rumenz();
       a=null;
    }
}

栈帧中的本地变量 a=null, 因为a 断开了与 GC Root 对象 (a 对象) 的分割, 所以 a 对象会被回收。因为给 Rumenz 的成员变量 r 赋值了变量的援用, 并且 r 成员变量是动态的, 所以 r 就是一个 GC Root 对象, 所以 r 指向的对象不会被回收。

办法区常量援用的对象

public class Rumenz{public static final Rumenz r=new Rumenz();
    public static void main(String[] args){Rumenz a=new Rumenz();
       a=null;
    }
  
}

常量 r 援用的对象不会因为 a 援用的对象的回收而被回收。

本地办法栈中 JNI 援用的对象

JNIEXPORT void JNICALL Java_com_pecuyu_jnirefdemo_MainActivity_newStringNative(JNIEnv *env, jobject instance,jstring jmsg) {
...
   // 缓存 String 的 class
   jclass jc = (*env)->FindClass(env, STRING_PATH);
}

本地办法就是一个 java 调用非 java 代码的接口,该办法并非 Java 实现的,可能由 C 或 Python 等其余语言实现的,Java 通过 JNI 来调用本地办法,而本地办法是以库文件的模式寄存的(在 WINDOWS 平台上是 DLL 文件模式,在 UNIX 机器上是 SO 文件模式)。通过调用本地的库文件的外部办法,使 JAVA 能够实现和本地机器的紧密联系,调用零碎级的各接口办法,

当调用 Java 办法时,虚构机会创立一个栈桢并压入 Java 栈,而当它调用的是本地办法时,虚构机会放弃 Java 栈不变,不会在 Java 栈祯中压入新的祯,虚拟机只是简略地动静连贯并间接调用指定的本地办法。

退出移动版