JVM類加載分爲5個過程:加載,驗證,準備,解析,初始化,使用,卸載,以下圖所示: java
加載是指查找字節流並據此建立類的過程。git
BootStrap ClassLoader
、ClassLoader
、ExtClassLoader
、AppClassloader
等類加載器來查找字節流並建立的。鏈接是指將建立好的類放入JVM並使之可以很好的執行的過程。
它可分爲驗證、準備、解析三個步驟。github
初始化的目的是爲標記爲常量的字段賦值,以及執行
clinit
方法的過程。數組
在初始化一個靜態字段的時候,咱們能夠再聲明時直接賦值,也能夠在靜態代碼塊中對其進行賦值。
若是直接賦值的字段被final所修飾,而且字段爲基本數據類型和String類型,那麼該字段會被編譯標記爲常量值,其初始化直接由JVM完成。除此以外的全部直接賦值和靜態代碼塊中賦值操做,會被java編譯器放到clinit
方法中。
數據結構
(1) 虛擬機啓動的時候,初始化用戶指定的主類。
(2) 使用new該類實例化對象的時候。
(3) 訪問靜態字段或靜態方法時,初始化靜態字段或靜態方法所在類。
(4) 子類初始化會觸發父類初始化。
(5) 若是接口定義了default方法,那麼實現該接口的類初始化會觸發該接口的初始化。
(6) 使用反射API的時候。
(7) 當使用JDK1.7的動態語言支持時,若是一個java.invoke.MethodHandle實例最後的解析結果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,而且這個方法句柄所對應的類沒有進行過初始化,則須要先觸發其初始化。code
參考連接:
nomico271.github.io/2017/07/07/…cdn