JVM啟動及類載入
阿新 • • 發佈:2021-07-05
原料
- Win10作業系統,安裝好JDK,配置好環境變數: JAVA_HOME, Path, CLASSPATH
- 在D:\test下,寫一個HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
- javac編譯HelloWorld.java得到HelloWorld.class
- 使用命令:java HelloWorld 執行該類,得到輸出結果:Hello World!
java HelloWorld 命令執行過程分析
- 這個命令裡的java就是位於JAVA_HOME/bin下的java.exe可執行程式
- 這個命令裡的HelloWorld是給java.exe傳遞的引數,代表的是HelloWorld.class檔案
- 當執行該命令時,Win10作業系統呼叫java.exe可執行程式,並給它傳遞引數HelloWorld
- java.exe會啟動一個JVM(C++編寫的)
- JVM裡面會啟動一個ClassLoader例項(C++編寫的),這個ClassLoader叫做引導類載入器
- 引導類載入器例項會載入一個由Java編寫的類sun.misc.Launcher的例項
- Launcher例項會載入另外兩個類載入器(由Java實現):ExtClassLoader,AppClassLoader
- AppClassLoader會載入標題中的給java命令傳遞進來的引數HelloWorld所代表的類
- 它會讀取HelloWorld.class檔案,根據裡面資訊,生成這個類的Class物件
- JVM執行這個Class裡面的main方法。
- 銷燬JVM。
三個類載入器之間的關係
- 引導類載入器由C++實現,由JVM生成其例項,只負責載入一個類sun.misc.Launcher的例項
- ExtClassLoader,AppClassLoader由Java實現,都間接繼承自java.security.ClassLoader,由sun.misc.Launcher例項負責生成他們的例項,他們也是寫在sun.misc.Launcher類裡面的兩個靜態類
- ExtClassLoader負責載入JDK裡面的類
- AppClassLoader負責載入我們自己寫的類
- 三個類載入器的關係是父子關係,AppClassLoader裡面的parent屬性指向ExtClassLoader,ExtClassLoader裡面的parent屬性指向“引導類載入器”