1. 程式人生 > >JVM總括三-位元組碼、位元組碼指令、JIT編譯執行

JVM總括三-位元組碼、位元組碼指令、JIT編譯執行

JVM總括三-位元組碼、位元組碼指令、JIT編譯執行


 

  java檔案編譯後的class檔案,java跨平臺的中間層,JVM通過對位元組碼的解釋執行(執行模式,還有JIT編譯執行,下面講解),遮蔽對作業系統的依賴。一個位元組(8位)可以儲存256中不同的指令,這樣的指令就是位元組碼,java所有指令有200個左右,這些指令組成了位元組碼檔案(.class)。

一、位元組碼的主要指令:

  .class檔案裡面的十六進位制檔案(如:圖一),其中CAFE BABE是標誌這個檔案為java的編譯後的檔案,00000034代表版本號,01670700一個位元組(8位)就是一個位元組指令,由於數值指令太難看懂,我們可以用javap

將指令翻譯為助記指令(如:圖二)。

  圖一

  圖二

1、載入或儲存指令

  在棧幀中,通過指令操作資料在區域性變量表與操作棧間傳遞。

  • ILOAD、ALOAD:將int、物件引用型別從區域性變量表壓入操作棧頂;
  • ISTORE、ASTORE:將int、物件引用型別從操作棧頂儲存到區域性變量表裡;
  • ICONST、BIPUSH、SIPUSH、LDC:將常亮載入到操作棧頂。

2、運算指令

  對操作棧上的值進行運算,並把結果寫入操作棧頂,如IADD、IMUL

3、型別轉換指令

  I2L、D2F

4、物件建立與訪問指令

   NEW

 除了位元組碼指令外,還包括像LINENUMBER儲存位元組碼與原始碼對應,方便除錯定位;LOCALVARIABLE儲存當前方法使用到的區域性表量表。

二、java原始碼檔案轉化為位元組碼(.class)檔案的過程

   JAVA原始檔---------->詞法解析---------->語法解析---------->語義分析--------->生成位元組碼--------->位元組碼檔案

  詞法分析:根據空格分割出單詞、操作符等,形成token資訊流;

  語法分析:根據token流和java語法規範生成語法樹;

  語義分析:檢查關鍵字、型別匹配是否正確;

三、執行模式

1、解釋執行

  JVM通過載入到的位元組碼進行執行;

2、JIT編譯執行

  將熱點程式碼(例如:高頻方法體、迴圈體、公共模組)直接翻譯成機器碼,提高以後的執行效率;

3、JIT編譯執行與解釋執行混合執行(主流JVM執行模式)

  每次方法呼叫的時候,方法呼叫計數器加1,如果計數達到閾值,請求編譯成機器碼,將機器碼放在Code cache裡面,下次執行檢視是否已編譯成機器碼,已編譯的直接執行機器碼,沒有編譯的通過解釋執行(也就是執行位元組碼);