jvm----類載入過程(原創筆記)
阿新 • • 發佈:2020-10-20
前言
jvm不關心class來源於什麼語言
程式碼編譯的結果從本地機器碼變為位元組碼。jvm虛擬機器不與語言繫結,只與class檔案這種特定的二進位制檔案關聯。任何語言的實現者都可以將jvm作為他們語言執行的基礎,以class檔案作為他們產品的交付媒介。
深入理解類的“初始化”
《jvm虛擬機器規範》嚴格規定一下情況需立即對類進行“初始化”:
1、遇到new時,若沒進行過初始化,則先初始化;讀取或設定一個型別的靜態欄位時;呼叫一個型別的靜態方法時;
2、使用java.lang.reflect包的方法對型別進行反射呼叫時;
3、發現要初始化的類其父類還沒進行過初始化時,現觸發父類初始化;
4、jvm啟動時,要執行主類main方法,會先初始化這個主類;
以上幾點為主動引用,即主動去初始化,那麼什麼是被動應用呢,如下:
1、通過子類引用父類的靜態欄位,不會導致子類初始化;(自行測試)
2、通過陣列來引用類,不會觸發此類的初始化;
3、常量在編譯階段會存入呼叫類常量池,本質上沒有直接引用到定義常量的類,因此不會觸發定義常量的類的初始化;
深入理解類載入
1、jdb8前三層類載入器:
啟動類載入器:Bootstrap ClassLoader,負責載入存放在JDK\jre\lib;
擴充套件類載入器:Extension ClassLoader,它負責載入JDK\jre\lib\ext目錄中;
應用程式類載入器:Application ClassLoader。
3、違背雙親委派模型,不少框架會自行實現classloader滿足特定需求,如Tomcat、osgi
jdk9 新特性
引入java模組化系統,可配置的封裝隔離機制。首先要解決之前版本中基於類路徑來查詢依賴。模組化顯示宣告模組依賴,避免執行依賴引發的執行時異常。