總算弄明白JVM類加載子系統做了什麼


總概括:類加載子系統的主要任務是將字節碼文件加載到內存中(將這個文件從磁盤中加載到內存中)

要完成這個任務,類加載子系統將這個任務分成了三個階段--加載、鏈接、初始化


總算弄明白JVM類加載子系統做了什麼

類加載過程


加載

說明:類加載子系統整個階段叫做加載,這裡的加載是其中一個部分,恰好也叫加載

這個過程的主要任務:通過類的全限定名,將該類從硬盤上加載到內存中,在內存中生成該類的類對象(通俗的說,就是生成這個類,注意是類,不是對象)


總算弄明白JVM類加載子系統做了什麼

public class Student{

private static String country;

private String name;


public void say(){

System.out.println("hello");

}

}


鏈接

鏈接階段,分為三個過程,驗證、準備、解析

1.驗證:對加載進來的文件進行驗證,保證這個類是正確的

  • 驗證的必要性,.class文件是文件,那麼就有可能被修改,修改之後格式可能不正確,為確保jvm處理一個正確的類,那麼首先對加載進內存的class進行驗證。

2.準備:為類變量設置為“零”值

總算弄明白JVM類加載子系統做了什麼

鏈接階段

public class Student{

private static String country=null;//基本變量賦值為“零”值,所有引用類型賦值為null,常量是在編譯階段就賦值了

private String name;


public void say(){

System.out.println("hello");

}

}

3.解析:將符號引用解析為直接引用

在.class文件中的常量池中有許多引用,由於jvm要提高複用性,所有引用拆分的比較細,在這個過程中將這些符號引用變為直接引用

初始化

作用:類變量的賦值、執行靜態代碼塊

下圖中,學生類就會在該過程將類變量country賦值為China,並且執行靜態代碼塊,打印hello

總算弄明白JVM類加載子系統做了什麼

初始化

public class Student{

private static String country="China";//類變量賦值

private String name;


static {//執行靜態代碼塊

System.out.println("hello");

}

}

總結

經過加載、鏈接、初始化,class文件就從磁盤上轉移到內存上了

結尾:如果有什麼疑問,可以在下方評論,我會一一作答


分享到:


相關文章: