一.JVM是什么
1.jvm是java虛擬機,是java程序運行的基礎環境
2.jvm運行的是java源代碼經過編譯后的class文件,這些class文件經過jvm負責解釋或即時編譯為對應平臺的機器碼并執行
3.class文件也可以通過其他【jvm languages】經過編譯后得到,例如scala、kotlin、groovy等
二.JVM的類加載機制
JVM的類加載機制分為:加載,鏈接,初始化三個階段
鏈接又分為驗證,準備,解析三個階段
1.加載
將二進制流讀入內存,生成一個class對象
加載機制-雙親委派機制
即加載器加載類時先把請求委托給自己的父類加載器執行,直到頂層的啟動類加載器.
父類加載器能夠完成加載則成功返回,不能則子類加載器才自己嘗試加載.
(圖源黑馬)
優點:
1. 避免類的重復加載
2. 避免Java的核心API被篡改如何打破雙親委派機制:
1. 自定義類加載器時,重寫 `ClassLoader` 的 `loadClass` 方法,改變默認的 “先委派父加載器” 邏輯。比如,可強制讓自定義加載器優先加載特定路徑、特定前綴的類,而非嚴格遵循雙親委派的委派順序。
2. Java 標準庫中(如 JDBC、JAXP ),核心類由啟動類加載器加載,但實現類(如 MySQL JDBC 驅動)在應用類路徑。為讓核心類(父加載器加載)能加載應用類路徑的實現類,`ServiceLoader` 會**反向委派**:父加載器(如 `Bootstrap ClassLoader` )加載的類,委派給應用類加載器(`AppClassLoader` )加載其實現類,打破 “父加載器無法請求子加載器” 的雙親委派限制。
3. OSGi 是模塊化框架,每個模塊(Bundle)有獨立類加載器。加載類時,**按需委派**:可配置加載策略(如 “先自己加載,再委派父加載器”,或 “特定包委派給指定加載器” ),完全突破雙親委派的固定順序,實現類加載的 “細粒度控制”。
2.鏈接
2.1驗證
驗證加載進來的二進制流是否符合一定格式
2.2準備
為類或接口的靜態字段賦默認值
2.3解析
將常量池的符號引用轉換為直接引用
3.初始化
執行靜態代碼塊,為靜態變量賦值