java編譯器和解釋器


https://blog.csdn.net/sunxianghuang/article/details/52094859

解釋器 + JIT編譯器就是JVM執行引擎

1.1Java Compiler (Java 編譯器)
Java compiler reads source files written in the Java programming language, and compiles them into bytecode class files.
Java編譯器讀取java源文件(*.java)並將它們編譯為java字節碼文件(*.class)。
Windows系統中的javac.exe可以簡單看成是Java編譯器。

 

1.2Java Interpreter(Java 解釋器)

Java compilers generate machine-independent bytecodes instead of machine instructions. The interpreter is like a CPU implemented in software. It decodes and executes bytecodes, independent of what computer they were compiled on.
Java編譯器生成的是與機器碼不同的java字節碼,並不能被硬件中的CPU直接執行。而java解釋器就像植根於軟件中的CPU,能夠解析並執行java字節碼。
Windows系統中的java.exe可以簡單看成是Java解釋器。

1.3Write Once,Run Anywhere
Java有個口號是“Write Once,Run Anywhere”,旨在展示Java程序設計語言的跨平台特性,而能夠實現這個特性的基礎就是java字節碼文件和能夠執行它的Java虛擬機 - JVM,一個可以在不同的硬件平台和操作系統上運行java字節碼的神器。所以很清晰了,生成java字節碼文件就是Java編譯器的工作,而執行字節碼的工作就是JVM中Java解釋器干的活,沒有它們就沒有“Write Once,Run Anywhere”。
 
2.1JIT編譯器(Just In Time Compile 即時編譯器)
Java 程序最初是通過解釋器來解釋執行的,當虛擬器發現某個方法或代碼塊的運行特別頻繁時,就會把這些代碼認定為“熱點代碼”,為了提高熱點代碼的執行效率,在運行時,虛擬機會把這些代碼編譯為機器碼,並進行各種層次的優化,完成這個任務的編譯器成為即使編譯器

HotSpot虛擬機中內置了兩個即時編譯器:Client Complier和Server Complier,簡稱為C1、C2編譯器,分別用在客戶端和服務端。目前主流的HotSpot虛擬機中默認是采用解釋器與其中一個編譯器直接配合的方式工作。程序使用哪個編譯器,取決於虛擬機運行的模式。HotSpot虛擬機會根據自身版本與宿主機器的硬件性能自動選擇運行模式,用戶也可以使用“-client”或“-server”參數去強制指定虛擬機運行在Client模式或Server模式。

用Client Complier獲取更高的編譯速度,用Server Complier 來獲取更好的編譯質量。為什么提供多個即時編譯器與為什么提供多個垃圾收集器類似,都是為了適應不同的應用場景。

 
在 HotSpot 實現中有多種選擇:C1、C2 和 C1 + C2,分別對應 client、server 和分層編譯。
1、C1 編譯速度快,優化方式比較保守;
2、C2 編譯速度慢,優化方式比較激進;
3、C1 + C2 在開始階段采用 C1 編譯,當代碼運行到一定熱度之后采用 G2 重新編譯;
在 JDK8 之前,分層編譯默認是關閉的,可以添加 -server -XX:+TieredCompilation 參數進行開啟


2.2什么是熱點代碼

  • 被多次調用的方法:方法調用的多了,代碼執行次數也多,成為熱點代碼很正常。
  • 被多次執行的循環體:假如一個方法被調用的次數少,只有一次或兩次,但方法內有個循環,一旦涉及到循環,部分代碼執行的次數肯定多,這些多次執行的循環體內代碼也被認為“熱點代碼”。

如何檢測熱點代碼

  • 基於采樣的熱點探測(Sample Based Hot Spot Detection):虛擬機會周期的對各個線程棧頂進行檢查,如果某些方法經常出現在棧頂,這個方法就是“熱點方法”。
    缺點:不夠精確,容易受到線程阻塞或外界因素的影響
    優點:實現簡單、高效,很容易獲取方法調用關系
  • 基於計數器的熱點探測(Counter Based Hot Spot Detection):為每個方法(甚至是代碼塊)建立計數器,執行次數超過閾值就認為是“熱點方法”。
    缺點:實現麻煩,不能直接獲取方法的調用關系
    優點:統計結果精確

  HotSpot 虛擬器為每個方法准備了兩類計數器:方法調用計數器和回邊計數器,兩個計數器都有一定的閾值,超過閾值就會觸發JIT 編譯。
  -XX:CompileThreshold 可以設置閾值大小,Client 編譯器模式下,閾值默認的值1500,而 Server 編譯器模式下,閾值默認的值則是10000

HotSpot虛擬機中使用的是哪鍾熱點檢測方式呢?
在HotSpot虛擬機中使用的是第二種——基於計數器的熱點探測方法,因此它為每個方法准備了兩個計數器:方法調用計數器和回邊計數器。在確定虛擬機運行參數的前提下,這兩個計數器都有一個確定的閾值,當計數器超過閾值溢出了,就會觸發JIT編譯。

  方法調用計數器
  顧名思義,這個計數器用於統計方法被調用的次數。
  當一個方法被調用時,會先檢查該方法是否存在被JIT編譯過的版本,如果存在,則優先使用編譯后的本地代碼來執行。如果不存在已被編譯過的版本,則將此方法的調用計數器值加1,然后判斷方法調用計數器與回邊計數器值之和是否超過方法調用計數器的閾值。如果超過閾值,那么將會向即時編譯器提交一個該方法的代碼編譯請求。
如果不做任何設置,執行引擎並不會同步等待編譯請求完成,而是繼續進行解釋器按照解釋方式執行字節碼,直到提交的請求被編譯器編譯完成。當編譯工作完成之后,這個方法的調用入口地址就會系統自動改寫成新的,下一次調用該方法時就會使用已編譯的版本。

 

  回邊計數器
  它的作用就是統計一個方法中循環體代碼執行的次數,在字節碼中遇到控制流向后跳轉的指令稱為“回邊”。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM