JVM中即時編譯器JIT與解釋器並存

一.學習目標java

1.瞭解解釋器與編譯器的概念與做用。數組

2.知道jvm中三種執行模式。緩存

3.瞭解熱點代碼。markdown

二.解釋器模式與編譯器模式以及混合模式app

  字節碼文件經過類裝載器裝載,被分配被分配到JVM的運行時數據區,而後會被執行引擎執行。執行引擎以指令爲單位讀取Java字節碼。它就像一個CPU同樣,一條一條地執行機器指令。每一個字節碼指令都由一個1字節的操做碼和附加的操做數組成。執行引擎取得一個操做碼,而後根據操做數來執行任務,完成後就繼續執行下一條操做碼。將人能讀懂的字節碼文件轉化爲jvm能夠讀懂執行的語言,在jvm中經過三種方式經行轉化,即解釋器模式,JIT編譯器模式,混合模式。jvm

1.解釋器模式學習

  一條一條地讀取,解釋而且執行字節碼指令。由於它一條一條地解釋和執行指令,因此它能夠很快地解釋字節碼,可是執行起來會比較慢,沒有JIT的配合下效率不高。優化

2.JIT編譯器模式url

  即時編譯器把整段字節碼不加篩選的編譯成機器碼不論其執行頻率是否有編譯價值,在程序響應時間的限制下,沒有達到最大的優化。spa

3.混合模式

  在解釋執行的模式下引入編譯執行,恰好能夠彌補相互的缺點,達到更優的效果。

  程序剛開始啓動的時候,由於解釋器能夠很快的解釋字節碼,因此首先發揮做用,解釋執行Class字節碼,在合適的時候,即時編譯器把整段字節碼編譯成本地代碼,而後,執行引擎就沒有必要再去解釋執行方法了,它能夠直接經過本地代碼去執行它。執行本地代碼比一條一條進行解釋執行的速度快不少,主要緣由是本地代碼是保存在緩存裏的。

混合模式下其各自的特色主要以下:

解釋器:

  • 程序啓動時首先發揮做用,解釋執行Class字節碼;
  • 省去編譯時間,加快啓動速度;
  • 但執行效率較低;

JIT編譯器:

  • 程序解釋運行後,JIT編譯器逐漸發揮做用;
  • 編譯成本地代碼,提升執行效率;
  • 但佔用程序運行時間、內存等資源;

三.熱點代碼  

  在剛開始的時候,jvm不知道這段代碼,是否會頻繁的調用方法,或是一個循環,也就是這段代碼被屢次執行,所以剛開始的時候並不會編譯代碼,將代碼翻譯成 java 字節碼相對於編譯這段代碼並執行代碼來講,要快不少。編譯器回去衡量哪些方法會被頻繁調用,若是一個方法的執行頻率超過一個特定的值的話,那麼這個方法就會被JIT編譯成本地代碼。而這個方法或代碼塊因其運行特別頻繁,就會認爲這是「熱點代碼」(Hot Spot Code)。當 JVM 執行某一方法或遍歷循環的次數越多,就會更加了解代碼結構,那麼 JVM 在編譯代碼的時候就作出相應的優化。

熱點代碼分爲二類:

  • 屢次被調用的方法
  • 屢次被執行的循環體

檢測熱點代碼:

  • 方法計數器:記錄方法調用的次數 
  • 回邊計數器:記錄代碼塊循環次數

當計數器數值大於默認閾值或指定閾值時,方法或代碼塊會被編譯成本地代碼。

四.總結

如上圖能夠看出,整個java應用程序的執行過程以下:

一、源代碼經javac編譯成字節碼,class文件

二、程序字節碼通過JIT環境變量進行判斷,是否屬於「熱點代碼」(屢次調用的方法,或循環等)

三、如是,走JIT編譯爲具體硬件處理器(如sparc、intel)機器碼

四、如否,則直接由解釋器解釋執行

 

參考資料:

https://blog.csdn.net/sinat_37138973/article/details/78438806
相關文章
相關標籤/搜索