1. 程式人生 > 實用技巧 >jvm----類載入過程(原創筆記)

jvm----類載入過程(原創筆記)

前言

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。

2、雙親委派模型,基本思想是:每一個類載入器都有一個父載入器,當需要載入一個class時,首先把該class的查詢和載入優先委派給父載入器進行,若父載入器無法載入該class(因父載入器的目錄限制),再去嘗試自行載入。
3、違背雙親委派模型,不少框架會自行實現classloader滿足特定需求,如Tomcat、osgi

jdk9 新特性

引入java模組化系統,可配置的封裝隔離機制。首先要解決之前版本中基於類路徑來查詢依賴。模組化顯示宣告模組依賴,避免執行依賴引發的執行時異常。