Java類加載過程

1、Java如何運行

  • Java代碼文件會編譯成可運行的.class字節碼文件;
  • JVM在運行.class文件時須要依賴的.class文件或者jar包裏面的某個.class,則經過類加載器去加載到內存;
  • JVM會基於本身的字節碼引擎,來執行加載到內存裏已寫好的類

2、類加載到使用的過程

加載->驗證->準備->解析->初始化->使用->卸載java

  1. 加載:JVM會將須要代碼運行時須要的類加載到內存中(經過類加載器);
  2. 驗證:根據Java虛擬機規範,校驗加載的.class文件內容是否符合指定的規範(例如字節碼文件被篡改);
  3. 準備:主要是分配內存空間;

若是有public static int count;相似這樣的變量 【類變量】,分配內存空間的同時初始化一個默認值this

  1. 解析:其實是將符號引用替換成直接引用
  2. 核心階段初始化: 在準備階段,對於count這個靜態變量會默認初始化0,可是賦值操做是在初始化階段,以下的Configuration.getInt("studnet.count");賦值操做;另外,靜態代碼塊的執行也是在這個階段。
public class LoadStudent {
    public static int count = Configuration.getInt("studnet.count");
    
    public static Map<String, Student> students;
    
    static {
        initStudents();
    }
    
    public static void initStudents() {
        this.students = new HashMap<String, Student>();
    }
}

複製代碼

類初始化的時機:當類被使用的到的時候,如:LoadStudent load = new LoadStudent(); 若是初始化一個類的時候,發現該類有父類,必須先初始化他的父類spa

實現上述初始化類的過程,須要由類加載器來完成,Java中的類加載器有:code

(1)啓動類加載器Bootstrap ClassLoader,啓動JVM,會加載jdk目錄下的lib目錄下的核心類庫cdn

(2)拓展類加載器Extension ClassLoader,啓動JVM,會加載jdk目錄下的lib/ext目錄下的拓展類庫blog

(3)應用程序類加載器Application ClassLoader,加載classpath環境變量哦指定的路徑中的類,能夠理解成加載你寫到的Java代碼到內存內存

(4)自定義類加載器,除了上述幾種類加載器以外,還能夠自定義類加載器get

他們親子層結構關係以下圖:虛擬機

雙親委派機制:簡單來講,子類加載器先會找父類加載器去加載類,找不到的話再由子類去加載string

相關文章
相關標籤/搜索