1. 程式人生 > 其它 >JVM啟動及類載入

JVM啟動及類載入

原料

  1. Win10作業系統,安裝好JDK,配置好環境變數: JAVA_HOME, Path, CLASSPATH
  2. 在D:\test下,寫一個HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
  1. javac編譯HelloWorld.java得到HelloWorld.class
  2. 使用命令:java HelloWorld 執行該類,得到輸出結果:Hello World!

java HelloWorld 命令執行過程分析

  1. 這個命令裡的java就是位於JAVA_HOME/bin下的java.exe可執行程式
  2. 這個命令裡的HelloWorld是給java.exe傳遞的引數,代表的是HelloWorld.class檔案
  3. 當執行該命令時,Win10作業系統呼叫java.exe可執行程式,並給它傳遞引數HelloWorld
  4. java.exe會啟動一個JVM(C++編寫的)
  5. JVM裡面會啟動一個ClassLoader例項(C++編寫的),這個ClassLoader叫做引導類載入器
  6. 引導類載入器例項會載入一個由Java編寫的類sun.misc.Launcher的例項
  7. Launcher例項會載入另外兩個類載入器(由Java實現):ExtClassLoader,AppClassLoader
  8. AppClassLoader會載入標題中的給java命令傳遞進來的引數HelloWorld所代表的類
  9. 它會讀取HelloWorld.class檔案,根據裡面資訊,生成這個類的Class物件
  10. JVM執行這個Class裡面的main方法。
  11. 銷燬JVM。

三個類載入器之間的關係

  1. 引導類載入器由C++實現,由JVM生成其例項,只負責載入一個類sun.misc.Launcher的例項
  2. ExtClassLoader,AppClassLoader由Java實現,都間接繼承自java.security.ClassLoader,由sun.misc.Launcher例項負責生成他們的例項,他們也是寫在sun.misc.Launcher類裡面的兩個靜態類
  3. ExtClassLoader負責載入JDK裡面的類
  4. AppClassLoader負責載入我們自己寫的類
  5. 三個類載入器的關係是父子關係,AppClassLoader裡面的parent屬性指向ExtClassLoader,ExtClassLoader裡面的parent屬性指向“引導類載入器”
站在巨人的肩膀上,可以使你看的更遠,學無止境!