可达性算法中以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 栈祯中压入新的祯,虚拟机只是简略地动静连贯并间接调用指定的本地办法。