JVM總括三-字節碼、字節碼指令、JIT編譯執行html
目錄:JVM總括:目錄java
java文件編譯後的class文件,java跨平臺的中間層,JVM經過對字節碼的解釋執行(執行模式,還有JIT編譯執行,下面講解),屏蔽對操做系統的依賴。一個字節(8位)能夠儲存256中不一樣的指令,這樣的指令就是字節碼,java全部指令有200個左右,這些指令組成了字節碼文件(.class)。post
.class文件裏面的十六進制文件(如:圖一),其中CAFE BABE是標誌這個文件爲java的編譯後的文件,00000034表明版本號,01670700一個字節(8位)就是一個字節指令,因爲數值指令太難看懂,咱們能夠用javap將指令翻譯爲助記指令(如:圖二)。spa
圖一操作系統
圖二翻譯
在棧幀中,經過指令操做數據在局部變量表與操做棧間傳遞。調試
對操做棧上的值進行運算,並把結果寫入操做棧頂,如IADD、IMUL。htm
I2L、D2F對象
NEWblog
除了字節碼指令外,還包括像LINENUMBER儲存字節碼與源碼對應,方便調試定位;LOCALVARIABLE儲存當前方法使用到的局部表量表。
JAVA源文件---------->詞法解析---------->語法解析---------->語義分析--------->生成字節碼--------->字節碼文件
詞法分析:根據空格分割出單詞、操做符等,造成token信息流;
語法分析:根據token流和java語法規範生成語法樹;
語義分析:檢查關鍵字、類型匹配是否正確;
一、解釋執行
JVM經過加載到的字節碼進行執行;
二、JIT編譯執行
將熱點代碼(例如:高頻方法體、循環體、公共模塊)直接翻譯成機器碼,提升之後的執行效率;
三、JIT編譯執行與解釋執行混合執行(主流JVM執行模式)
每次方法調用的時候,方法調用計數器加1,若是計數達到閾值,請求編譯成機器碼,將機器碼放在Code cache裏面,下次執行查看是否已編譯成機器碼,已編譯的直接執行機器碼,沒有編譯的經過解釋執行(也就是執行字節碼);