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

JVM總括三-字節碼、字節碼指令、JIT編譯執行

代碼 分割 文件 auto load 加載 依賴 strong 技術

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裏面,下次執行查看是否已編譯成機器碼,已編譯的直接執行機器碼,沒有編譯的通過解釋執行(也就是執行字節碼);

JVM總括三-字節碼、字節碼指令、JIT編譯執行