位元組碼
意義
位元組碼存在的意義就是解決Java跨平台問題,一次編寫,到處執行。在不同的作業系統、不同硬體平台上,均可以不同修改代碼即可順暢地執行。作為Java與作業系統的中間碼,成功解耦了語言對平台的依賴性。
什麼是位元組碼
Java所有的指令有200個左右,一個位元組(8位)可以存儲256中不同的指令資訊,一個這樣的位元組稱為位元組碼。在執行過程中,JVM将位元組碼解釋執行,屏蔽對底層作業系統的依賴,JVM也可以将位元組碼編譯執行,如果是熱點代碼。會通過JIT動态地編譯為機器碼,提高執行效率。
位元組碼主要指令
1、加載或存儲指令
在某個棧幀中,通過指令操作資料在虛拟機棧的局部變量表和操作棧之間來回傳輸。
(1)将局部變量加載到操作棧中,
ILOAD
(将int類型的局部變量壓入棧)和
ALOAD
(将對象引用的局部變量壓入棧);
(2)從操作棧定存儲到局部變量表,如
ISTORE
、
ASTORE
等;
(3)将常量加載到操作棧頂,
ICONST
,
BIPUSH
,
SIPUSH
、
LDC
等;
2、運算指令
對兩個操作棧幀上的值進行運算,并把結果寫入操作棧頂;
3、類型轉換指令
顯式轉換兩種不同的數值類型;
4、對象建立于通路指令
(1)建立對象指令,
NEW
、
NEWARRAY
;
(2)通路屬性指令;
(3)檢查執行個體類型指令;
5、操作棧管理指令
(1)出棧操作;
(2)指派棧頂元素并壓入棧;
6、方法調用與傳回指令
(1)
INVOKEVIRTUAL
指令:調用對象的執行個體方法;
(2)
INVOKESPECIAL
指令:調用執行個體初始化方法、私有方法、父類方法;
(3)
INVOKESTATIC
指令:調用類靜态方法;
(4)
RETURN
指令:傳回VIOD類型;
源碼轉為位元組碼的過程
- 詞法解析:通過空格分隔出單詞、操作符、控制符等資訊,将其形成token資訊流,傳遞給文法解析器;
- 文法解析:在文法解析時,把詞法解析得到的token資訊流按照Java文法規則組裝成一課文法樹,
- 文法分析:在這個階段需要檢查關鍵字的使用是否合理、類型是否比對、作用域是否正确等;
- 生成位元組碼;
執行方式
位元組碼必須通過類加載過程加載到JVM環境後才可以執行,執行有三種模式:
- 解釋執行;
- JIT編譯執行;
- JIT編譯和解釋混合執行。
混合執行
解釋器在啟動時先解釋執行,省去編譯時間,随着時間推進,JVM通過熱點代碼統計分析,識别出高頻的方法調用、循環體、公共子產品等,基于強大的JIT動态編譯技術,将特典代碼轉換很久起碼,直接交給CPU執行。