天天看點

深入了解JVM——位元組碼

位元組碼

意義

位元組碼存在的意義就是解決Java跨平台問題,一次編寫,到處執行。在不同的作業系統、不同硬體平台上,均可以不同修改代碼即可順暢地執行。作為Java與作業系統的中間碼,成功解耦了語言對平台的依賴性。

什麼是位元組碼

Java所有的指令有200個左右,一個位元組(8位)可以存儲256中不同的指令資訊,一個這樣的位元組稱為位元組碼。在執行過程中,JVM将位元組碼解釋執行,屏蔽對底層作業系統的依賴,JVM也可以将位元組碼編譯執行,如果是熱點代碼。會通過JIT動态地編譯為機器碼,提高執行效率。

位元組碼主要指令

1、加載或存儲指令

在某個棧幀中,通過指令操作資料在虛拟機棧的局部變量表和操作棧之間來回傳輸。

(1)将局部變量加載到操作棧中,

ILOAD

(将int類型的局部變量壓入棧)和

ALOAD

(将對象引用的局部變量壓入棧);

(2)從操作棧定存儲到局部變量表,如

ISTORE

ASTORE

等;

(3)将常量加載到操作棧頂,

ICONST

,

BIPUSH

,

SIPUSH

LDC

等;

深入了解JVM——位元組碼

2、運算指令

對兩個操作棧幀上的值進行運算,并把結果寫入操作棧頂;

3、類型轉換指令

顯式轉換兩種不同的數值類型;

4、對象建立于通路指令

(1)建立對象指令,

NEW

NEWARRAY

(2)通路屬性指令;

(3)檢查執行個體類型指令;

5、操作棧管理指令

(1)出棧操作;

(2)指派棧頂元素并壓入棧;

6、方法調用與傳回指令

(1)

INVOKEVIRTUAL

指令:調用對象的執行個體方法;

(2)

INVOKESPECIAL

指令:調用執行個體初始化方法、私有方法、父類方法;

(3)

INVOKESTATIC

指令:調用類靜态方法;

(4)

RETURN

指令:傳回VIOD類型;

源碼轉為位元組碼的過程

深入了解JVM——位元組碼
  • 詞法解析:通過空格分隔出單詞、操作符、控制符等資訊,将其形成token資訊流,傳遞給文法解析器;
  • 文法解析:在文法解析時,把詞法解析得到的token資訊流按照Java文法規則組裝成一課文法樹,
  • 文法分析:在這個階段需要檢查關鍵字的使用是否合理、類型是否比對、作用域是否正确等;
  • 生成位元組碼;

執行方式

位元組碼必須通過類加載過程加載到JVM環境後才可以執行,執行有三種模式:

  • 解釋執行;
  • JIT編譯執行;
  • JIT編譯和解釋混合執行。

混合執行

解釋器在啟動時先解釋執行,省去編譯時間,随着時間推進,JVM通過熱點代碼統計分析,識别出高頻的方法調用、循環體、公共子產品等,基于強大的JIT動态編譯技術,将特典代碼轉換很久起碼,直接交給CPU執行。

深入了解JVM——位元組碼