JVM
一、 定義
- 抽象化計算機
- 擁有自己的記憶體模型和指令系統
大白話:
1、所謂抽象化,就是針對現實世界的物理機
2、有了指令系統,執行引擎才有存在的必要性
複製程式碼
二、重點部分
1、Class檔案
Class檔案是一種二進位制位元組流,擁有嚴格的資料格式。
-
①:二進位制位元組流:class檔案是由 0101010 這樣的東西組成的,以1個位元組(8位)讀取才有意義。
-
②:嚴格的資料格式:前32位(即前4個位元組)是魔術,接下來16位是次版本號,再往後16位是主版本號等
因為Class有自己的資料格式,所以,在Class位元組流裡面,JVM可以很順利的閱讀Class的語義,並轉化為JVM的資料格式。
P215頁
2、類載入器
看上面的圖最下面一行,為什麼會說載入階段和連線階段是交叉執行的,我是這麼理解的
- 第一步,JVM讀取Class檔案的前32位(即U4),放到記憶體的一個特定的地方,為什麼是特定地方,因為JVM也是有自己的資料結構的
- 第二步,呼叫 連線階段的 “驗證” 功能,看看這個U4 是不是 CAFABABE這個魔數,如果不是的話,就不用載入了
- 第三步,JVM讀取Class檔案中接下來的32位,放到記憶體的另外一個地方
- 第四步,呼叫 驗證功能,看看這4個位元組所解析的版本號,能不能被當前JVM解析
P166頁