什麼是GC Roots

可達性算法中以GC Root對象爲起點開始搜索。

img

什麼是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);
}

7

本地方法就是一個 java 調用非 java 代碼的接口,該方法並不是 Java 實現的,可能由 C 或 Python等其餘語言實現的, Java 經過 JNI 來調用本地方法, 而本地方法是以庫文件的形式存放的(在 WINDOWS 平臺上是 DLL 文件形式,在 UNIX 機器上是 SO 文件形式)。經過調用本地的庫文件的內部方法,使 JAVA 能夠實現和本地機器的緊密聯繫,調用系統級的各接口方法,
當調用 Java 方法時,虛擬機會建立一個棧楨並壓入 Java 棧,而當它調用的是本地方法時,虛擬機會保持 Java 棧不變,不會在 Java 棧禎中壓入新的禎,虛擬機只是簡單地動態鏈接並直接調用指定的本地方法。

相關文章
相關標籤/搜索